Skip to content

Commit 2aeee87

Browse files
committed
Fix requested change
1 parent e016dad commit 2aeee87

5 files changed

Lines changed: 62 additions & 51 deletions

File tree

configlib-adventure/src/main/java/de/exlll/configlib/AdventureComponentSerializer.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,35 @@
1515
* Supports multiple formats including MiniMessage, legacy, and JSON.
1616
*/
1717
public final class AdventureComponentSerializer implements Serializer<Component, String> {
18-
private final List<AdventureComponentFormat> serializeOrder;
18+
private final AdventureComponentFormat serializeFormat;
1919
private final List<AdventureComponentFormat> deserializeOrder;
2020

2121
/**
2222
* Creates a new ComponentSerializer with separate format orders for
2323
* serialization and deserialization.
2424
*
25-
* @param serializeOrder the order of formats to try when serializing
25+
* @param serializeFormat the format to use when serializing
2626
* @param deserializeOrder the order of formats to try when deserializing
2727
*/
28-
public AdventureComponentSerializer(List<AdventureComponentFormat> serializeOrder,
29-
List<AdventureComponentFormat> deserializeOrder) {
30-
this.serializeOrder = List.copyOf(serializeOrder);
28+
public AdventureComponentSerializer(AdventureComponentFormat serializeFormat,
29+
List<AdventureComponentFormat> deserializeOrder) {
30+
this.serializeFormat = serializeFormat;
3131
this.deserializeOrder = List.copyOf(deserializeOrder);
3232
}
3333

3434
/**
3535
* Creates a new ComponentSerializer using the same format order for
3636
* both serialization and deserialization.
3737
*
38-
* @param formats the formats to use, in order of preference
38+
* @param serializeFormat the format to use for serialization
39+
* @param deserializeFormats the formats to use for deserialization, in order of
40+
* preference
3941
*/
40-
public AdventureComponentSerializer(AdventureComponentFormat... formats) {
41-
this(Arrays.asList(formats), Arrays.asList(formats));
42+
public AdventureComponentSerializer(AdventureComponentFormat serializeFormat,
43+
AdventureComponentFormat... deserializeFormats) {
44+
this(serializeFormat, deserializeFormats.length == 0
45+
? List.of(serializeFormat)
46+
: Arrays.asList(deserializeFormats));
4247
}
4348

4449
@Override
@@ -47,12 +52,7 @@ public String serialize(Component element) {
4752
return null;
4853
}
4954

50-
for (AdventureComponentFormat format : serializeOrder) {
51-
return serialize(element, format);
52-
}
53-
54-
// Fallback to MiniMessage
55-
return MiniMessage.miniMessage().serialize(element);
55+
return serialize(element, serializeFormat);
5656
}
5757

5858
@Override
@@ -77,29 +77,29 @@ private String serialize(Component component, AdventureComponentFormat format) {
7777
return switch (format) {
7878
case MINI_MESSAGE -> MiniMessage.miniMessage().serialize(component);
7979
case LEGACY_AMPERSAND ->
80-
LegacyComponentSerializer.legacyAmpersand().serialize(component);
80+
LegacyComponentSerializer.legacyAmpersand().serialize(component);
8181
case LEGACY_SECTION ->
82-
LegacyComponentSerializer.legacySection().serialize(component);
82+
LegacyComponentSerializer.legacySection().serialize(component);
8383
case MINECRAFT_JSON -> GsonComponentSerializer.gson().serialize(component);
8484
case TRANSLATION_KEY ->
85-
component instanceof TranslatableComponent translatableComponent
86-
? translatableComponent.key()
87-
: PlainTextComponentSerializer.plainText().serialize(component);
85+
component instanceof TranslatableComponent translatableComponent
86+
? translatableComponent.key()
87+
: PlainTextComponentSerializer.plainText().serialize(component);
8888
};
8989
}
9090

9191
private Component deserialize(String string, AdventureComponentFormat format) {
9292
return switch (format) {
9393
case MINI_MESSAGE ->
94-
MiniMessage.miniMessage().deserialize(string);
94+
MiniMessage.miniMessage().deserialize(string);
9595
case LEGACY_AMPERSAND ->
96-
LegacyComponentSerializer.legacyAmpersand().deserialize(string);
96+
LegacyComponentSerializer.legacyAmpersand().deserialize(string);
9797
case LEGACY_SECTION ->
98-
LegacyComponentSerializer.legacySection().deserialize(string);
98+
LegacyComponentSerializer.legacySection().deserialize(string);
9999
case MINECRAFT_JSON ->
100-
GsonComponentSerializer.gson().deserialize(string);
100+
GsonComponentSerializer.gson().deserialize(string);
101101
case TRANSLATION_KEY ->
102-
Component.translatable(string);
102+
Component.translatable(string);
103103
};
104104
}
105105
}

configlib-adventure/src/main/java/de/exlll/configlib/AdventureConfigLib.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public final class AdventureConfigLib {
1414
// component type
1515
private static final List<AdventureComponentFormat> DEFAULT_FORMAT_ORDER = List.of(
1616
AdventureComponentFormat.MINI_MESSAGE
17-
);
17+
);
1818

1919
private AdventureConfigLib() {
2020
}
@@ -26,31 +26,31 @@ private AdventureConfigLib() {
2626
* @param <B> the builder type
2727
* @return the builder with default serializers added
2828
*/
29-
public static <B extends ConfigurationProperties.Builder<B>>
29+
public static <B extends ConfigurationProperties.Builder<B>>
3030
ConfigurationProperties.Builder<B> addDefaults(
3131
ConfigurationProperties.Builder<B> builder) {
32-
return addDefaults(builder, DEFAULT_FORMAT_ORDER, DEFAULT_FORMAT_ORDER);
32+
return addDefaults(builder, DEFAULT_FORMAT_ORDER.get(0), DEFAULT_FORMAT_ORDER);
3333
}
3434

3535
/**
3636
* Adds default Adventure serializers to the configuration builder with custom
3737
* format orders.
3838
*
3939
* @param builder the configuration properties builder
40-
* @param serializeOrder the order of formats to try when serializing
40+
* @param serializeFormat the format to use when serializing
4141
* components
4242
* @param deserializeOrder the order of formats to try when deserializing
4343
* components
4444
* @param <B> the builder type
4545
* @return the builder with default serializers added
4646
*/
47-
public static <B extends ConfigurationProperties.Builder<B>>
47+
public static <B extends ConfigurationProperties.Builder<B>>
4848
ConfigurationProperties.Builder<B> addDefaults(
4949
ConfigurationProperties.Builder<B> builder,
50-
List<AdventureComponentFormat> serializeOrder,
50+
AdventureComponentFormat serializeFormat,
5151
List<AdventureComponentFormat> deserializeOrder) {
5252
builder.addSerializer(Component.class,
53-
new AdventureComponentSerializer(serializeOrder, deserializeOrder));
53+
new AdventureComponentSerializer(serializeFormat, deserializeOrder));
5454
builder.addSerializer(Key.class, new AdventureKeySerializer());
5555
builder.addSerializer(Sound.class, new AdventureSoundSerializer());
5656
return builder;

configlib-adventure/src/main/java/de/exlll/configlib/AdventureSoundSerializer.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import net.kyori.adventure.key.Key;
44
import net.kyori.adventure.sound.Sound;
55

6-
import java.util.Arrays;
76
import java.util.Objects;
87
import java.util.regex.Matcher;
98
import java.util.regex.Pattern;
10-
import java.util.stream.Collectors;
119

1210
/**
1311
* Serializer for {@link Sound} objects.
@@ -79,9 +77,15 @@ public Sound deserialize(String element) {
7977
? Float.parseFloat(matcher.group("volume"))
8078
: 1.0f;
8179

82-
Sound.Source source = matcher.group("source") != null
83-
? Sound.Source.valueOf(matcher.group("source"))
84-
: defaultSource;
80+
Sound.Source source = defaultSource;
81+
if (matcher.group("source") != null) {
82+
String sourceName = matcher.group("source");
83+
try {
84+
source = Sound.Source.valueOf(sourceName.toUpperCase());
85+
} catch (IllegalArgumentException e) {
86+
throw new ConfigurationException("Invalid sound source '" + sourceName + "' in: " + element);
87+
}
88+
}
8589

8690
return Sound.sound(key, source, volume, pitch);
8791
}
@@ -93,16 +97,11 @@ private static String formatFloatSimple(float value) {
9397
}
9498

9599
private static String buildRegex() {
96-
// Dynamic generate source part to avoid any future Minecraft or Adventure update
97-
String sourcePart = Arrays.stream(Sound.Source.values())
98-
.map(Enum::name)
99-
.collect(Collectors.joining("|"));
100-
101100
String deliminator = Pattern.quote(DELIMITER);
102101
return "^(?<key>[a-zA-Z0-9:._-]+)" +
103102
"(?:" + deliminator + "+(?<pitch>\\d+(?:\\.\\d+)?))?" +
104103
"(?:" + deliminator + "+(?<volume>\\d+(?:\\.\\d+)?))?" +
105-
"(?:" + deliminator + "+(?<source>" + sourcePart + "))?" +
104+
"(?:" + deliminator + "+(?<source>[a-zA-Z_]+))?" +
106105
deliminator + "*$";
107106
}
108107
}

configlib-adventure/src/test/java/de/exlll/configlib/AdventureComponentTests.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,13 @@ void testTranslatableComponentRoundTrip() {
4848

4949
String serialized = serializer.serialize(original);
5050

51-
String serializedWithDefaultMessage =
52-
serializer.serialize(originalWithDefaultMessage);
51+
String serializedWithDefaultMessage = serializer.serialize(originalWithDefaultMessage);
5352

5453
// Deserialize and validate returned TranslatableComponent
55-
TranslatableComponent deserialized =
56-
assertInstanceOf(TranslatableComponent.class,
57-
serializer.deserialize(serialized));
58-
TranslatableComponent deserializedWithDefaultMessage =
59-
assertInstanceOf(TranslatableComponent.class,
60-
serializer.deserialize(serializedWithDefaultMessage));
54+
TranslatableComponent deserialized = assertInstanceOf(TranslatableComponent.class,
55+
serializer.deserialize(serialized));
56+
TranslatableComponent deserializedWithDefaultMessage = assertInstanceOf(TranslatableComponent.class,
57+
serializer.deserialize(serializedWithDefaultMessage));
6158

6259
// Basic round-trip equality check
6360
assertEquals(original, deserialized,
@@ -89,7 +86,7 @@ private void runTestWithOrder(List<AdventureComponentFormat> deserializeOrder) {
8986
.newBuilder();
9087
// Set a fixed serialize order, we are testing deserialization.
9188
AdventureConfigLib.addDefaults(builder,
92-
List.of(AdventureComponentFormat.MINI_MESSAGE), deserializeOrder);
89+
AdventureComponentFormat.MINI_MESSAGE, deserializeOrder);
9390
YamlConfigurationProperties properties = builder.build();
9491

9592
YamlConfigurationStore<MixedConfiguration> store = new YamlConfigurationStore<>(

configlib-adventure/src/test/java/de/exlll/configlib/AdventureSoundSerializerTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,19 @@ void testRoundTrip() {
9393
assertEquals(original.volume(), deserialized.volume());
9494
assertEquals(original.pitch(), deserialized.pitch());
9595
}
96+
97+
@Test
98+
void testDeserializeInvalidSourceThrowsConfigurationException() {
99+
String input = "minecraft:test" + AdventureSoundSerializer.DELIMITER + "1.0"
100+
+ AdventureSoundSerializer.DELIMITER + "1.0"
101+
+ AdventureSoundSerializer.DELIMITER + "INVALID_SOURCE";
102+
103+
ConfigurationException exception = org.junit.jupiter.api.Assertions.assertThrows(
104+
ConfigurationException.class,
105+
() -> serializer.deserialize(input));
106+
107+
org.junit.jupiter.api.Assertions.assertTrue(
108+
exception.getMessage().contains("Invalid sound source 'INVALID_SOURCE'"),
109+
"Exception message should mention the invalid source");
110+
}
96111
}

0 commit comments

Comments
 (0)