Skip to content

Commit 505c245

Browse files
committed
Improvements to component serialization
1 parent 28303f3 commit 505c245

3 files changed

Lines changed: 56 additions & 51 deletions

File tree

src/main/java/org/machinemc/scriptive/serialization/ComponentSerializer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ default <C extends Component> C deserializeJson(JsonElement json) {
2222
return deserialize(GsonInstance.get().fromJson(json, new TypeToken<Map<String, Object>>() {}.getType()));
2323
}
2424

25-
<C extends Component> C deserialize(Map<String, Object> map);
25+
<C extends Component> C deserialize(Map<String, Object> properties);
26+
27+
static ComponentSerializer createDefault() {
28+
return new ComponentSerializerImpl();
29+
}
2630

2731
}
Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.machinemc.scriptive.serialization;
22

3+
import org.jetbrains.annotations.Nullable;
34
import org.machinemc.scriptive.components.Component;
45
import org.machinemc.scriptive.components.KeybindComponent;
56
import org.machinemc.scriptive.components.TextComponent;
@@ -10,13 +11,13 @@
1011
import org.machinemc.scriptive.style.HexColor;
1112

1213
import 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
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.machinemc.scriptive.serialization;
2+
3+
import org.machinemc.scriptive.components.Component;
4+
5+
import java.util.Map;
6+
7+
public record SerializedComponent(Map<String, Object> properties) {
8+
9+
public Component deserialize(ComponentSerializer serializer) {
10+
return serializer.deserialize(properties);
11+
}
12+
13+
}

0 commit comments

Comments
 (0)