11package org .machinemc .scriptive .serialization ;
22
3+ import org .jetbrains .annotations .Nullable ;
34import org .machinemc .scriptive .components .Component ;
45import org .machinemc .scriptive .components .KeybindComponent ;
56import org .machinemc .scriptive .components .TextComponent ;
1011import org .machinemc .scriptive .style .HexColor ;
1112
1213import java .util .*;
13- import java .util .function .Function ;
14+ import java .util .function .Consumer ;
1415
1516@ SuppressWarnings ("unchecked" )
16- public class ComponentSerializerImpl implements ComponentSerializer {
17+ class ComponentSerializerImpl implements ComponentSerializer {
1718
18- private final Map <String [] , Class <? extends Component >> componentKeysMap = new HashMap <>();
19- private final Map <Class <? extends Component >, ComponentCreator <?>> componentCreators = new HashMap <>();
19+ private final Map <String , Class <? extends Component >> componentKeysMap = new HashMap <>();
20+ private final Map <Class <? extends Component >, ComponentCreator <?>> componentCreators = new LinkedHashMap <>();
2021
2122 {
2223 register (KeybindComponent .class , properties -> KeybindComponent .of ((String ) properties .get ("keybind" )), "keybind" );
@@ -25,9 +26,8 @@ public class ComponentSerializerImpl implements ComponentSerializer {
2526 String translate = (String ) properties .get ("translate" );
2627 List <Map <String , Object >> argumentsMap = (List <Map <String , Object >>) properties .getOrDefault ("with" , new ArrayList <>());
2728 Component [] arguments = new Component [argumentsMap .size ()];
28- int index = 0 ;
29- for (Map <String , Object > map : argumentsMap )
30- arguments [index ++] = deserialize (map );
29+ for (int i = 0 ; i < argumentsMap .size (); i ++)
30+ arguments [i ] = deserialize (argumentsMap .get (i ));
3131 return TranslationComponent .of (translate , arguments );
3232 }, "translate" , "with" );
3333 }
@@ -36,7 +36,8 @@ public class ComponentSerializerImpl implements ComponentSerializer {
3636 public <T extends Component > void register (Class <T > type , ComponentCreator <T > creator , String ... uniqueKeys ) {
3737 if (componentCreators .containsKey (type ))
3838 throw new IllegalArgumentException ("Type '" + type + "' is already registered" );
39- componentKeysMap .put (uniqueKeys , type );
39+ for (String key : uniqueKeys )
40+ componentKeysMap .putIfAbsent (key , type );
4041 componentCreators .put (type , creator );
4142 }
4243
@@ -54,41 +55,23 @@ public <C extends Component> C deserialize(Map<String, Object> map) {
5455 .flatMap (color -> color .startsWith ("#" ) ? HexColor .of (color ) : ChatColor .byName (color ))
5556 .ifPresent (component ::setColor );
5657
57- Optional .ofNullable (map .get ("bold" ))
58- .filter (o -> o instanceof Boolean )
59- .map (o -> (Boolean ) o )
60- .ifPresent (component ::setBold );
61- Optional .ofNullable (map .get ("italic" ))
62- .filter (o -> o instanceof Boolean )
63- .map (o -> (Boolean ) o )
64- .ifPresent (component ::setItalic );
65- Optional .ofNullable (map .get ("underlined" ))
66- .filter (o -> o instanceof Boolean )
67- .map (o -> (Boolean ) o )
68- .ifPresent (component ::setUnderlined );
69- Optional .ofNullable (map .get ("strikethrough" ))
70- .filter (o -> o instanceof Boolean )
71- .map (o -> (Boolean ) o )
72- .ifPresent (component ::setStrikethrough );
73- Optional .ofNullable (map .get ("obfuscated" ))
74- .filter (o -> o instanceof Boolean )
75- .map (o -> (Boolean ) o )
76- .ifPresent (component ::setObfuscated );
77-
78- Optional .ofNullable (map .get ("insertion" ))
79- .map (String ::valueOf )
80- .ifPresent (component ::setInsertion );
81-
82- Optional .ofNullable (map .get ("clickEvent" ))
83- .filter (o -> o instanceof Map <?, ?>)
84- .map (o -> (Map <String , String >) o )
85- .map (ClickEvent ::deserialize )
86- .ifPresent (component ::setClickEvent );
87- Optional .ofNullable (map .get ("hoverEvent" ))
88- .filter (o -> o instanceof Map <?, ?>)
89- .map (o -> (Map <String , Object >) o )
90- .map (hoverEventMap -> HoverEvent .deserialize (this , hoverEventMap ))
91- .ifPresent (component ::setHoverEvent );
58+ deserializePart (map .get ("bold" ), Boolean .class , component ::setBold );
59+ deserializePart (map .get ("italic" ), Boolean .class , component ::setItalic );
60+ deserializePart (map .get ("underlined" ), Boolean .class , component ::setUnderlined );
61+ deserializePart (map .get ("strikethrough" ), Boolean .class , component ::setStrikethrough );
62+ deserializePart (map .get ("obfuscated" ), Boolean .class , component ::setObfuscated );
63+ deserializePart (map .get ("insertion" ), String .class , component ::setInsertion );
64+
65+ deserializePart (
66+ map .get ("clickEvent" ),
67+ Map .class ,
68+ properties -> component .setClickEvent (ClickEvent .deserialize (properties ))
69+ );
70+ deserializePart (
71+ map .get ("hoverEvent" ),
72+ Map .class ,
73+ properties -> component .setHoverEvent (HoverEvent .deserialize (this , properties ))
74+ );
9275
9376 if (map .containsKey ("extra" )) {
9477 component .clearSiblings ();
@@ -99,12 +82,10 @@ public <C extends Component> C deserialize(Map<String, Object> map) {
9982 return component ;
10083 }
10184
102- public Class <? extends Component > getComponentTypeFromMap (Map <String , Object > properties ) {
103- for (Map .Entry <String [], Class <? extends Component >> entry : componentKeysMap .entrySet ()) {
104- for (String key : entry .getKey ()) {
105- if (properties .containsKey (key ))
106- return entry .getValue ();
107- }
85+ public Class <? extends Component > getComponentTypeFromProperties (Map <String , Object > properties ) {
86+ for (String key : properties .keySet ()) {
87+ Class <? extends Component > type = componentKeysMap .get (key );
88+ if (type != null ) return type ;
10889 }
10990 return null ;
11091 }
@@ -117,7 +98,7 @@ public <T extends Component> ComponentCreator<T> getCreator(Class<T> type) {
11798 }
11899
119100 public <T extends Component > T newInstance (Map <String , Object > properties ) {
120- Class <T > type = (Class <T >) getComponentTypeFromMap (properties );
101+ Class <T > type = (Class <T >) getComponentTypeFromProperties (properties );
121102 if (type == null )
122103 throw new IllegalArgumentException ("Don't know how to turn " + properties + " into a component" );
123104 return newInstance (type , properties );
@@ -127,4 +108,11 @@ public <T extends Component> T newInstance(Class<T> type, Map<String, Object> pr
127108 return getCreator (type ).create (properties );
128109 }
129110
111+ private static <T > void deserializePart (@ Nullable Object part , Class <T > expected , Consumer <T > consumer ) {
112+ Optional .ofNullable (part )
113+ .filter (expected ::isInstance )
114+ .map (expected ::cast )
115+ .ifPresent (consumer );
116+ }
117+
130118}
0 commit comments