Skip to content

Commit 4340301

Browse files
committed
Expose static factory to create type serializers
1 parent 5e2fd08 commit 4340301

File tree

2 files changed

+80
-8
lines changed

2 files changed

+80
-8
lines changed

configlib-core/src/main/java/de/exlll/configlib/Serializers.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,42 @@
1919
import java.util.stream.IntStream;
2020
import java.util.stream.Stream;
2121

22-
final class Serializers {
22+
import static de.exlll.configlib.Validator.requireConfigurationType;
23+
import static de.exlll.configlib.Validator.requireNonNull;
24+
25+
/**
26+
* Class that contains static factory methods for the creation of {@code Serializer}s.
27+
*/
28+
public final class Serializers {
2329
private Serializers() {}
2430

31+
/**
32+
* Creates a new serializer that converts instances of the given configuration type
33+
* to {@code Map}s of valid target types.
34+
* <p>
35+
* The serializer returned by this method respects most configuration properties of
36+
* the given properties object. The following properties are ignored:
37+
* - All properties of subclasses of the configuration properties object
38+
* - Properties affecting environment variable resolution
39+
*
40+
* @param configurationType the type of configurations the newly created serializer
41+
* can convert
42+
* @param properties the configuration properties the serializer will use
43+
* @param <T> the configuration type
44+
* @return newly created serializer
45+
* @throws NullPointerException if any argument is null
46+
* @throws ConfigurationException if {@code type} is not a configuration type
47+
*/
48+
public static <T> Serializer<T, Map<?, ?>> newConfigurationTypeSerializer(
49+
Class<T> configurationType,
50+
ConfigurationProperties properties
51+
) {
52+
requireNonNull(configurationType, "configuration type");
53+
requireNonNull(properties, "configuration properties");
54+
requireConfigurationType(configurationType);
55+
return TypeSerializer.newSerializerFor(configurationType, properties);
56+
}
57+
2558
static <S extends Serializer<?, ?>> S newCustomSerializer(
2659
Class<S> serializerType,
2760
SerializerContext context
@@ -61,7 +94,7 @@ static final class NumberSerializer implements Serializer<Number, Number> {
6194
private final Class<? extends Number> cls;
6295

6396
public NumberSerializer(Class<? extends Number> cls) {
64-
this.cls = Validator.requireNonNull(cls, "number class");
97+
this.cls = requireNonNull(cls, "number class");
6598
Validator.requirePrimitiveOrWrapperNumberType(cls);
6699
}
67100

@@ -336,7 +369,7 @@ static final class EnumSerializer implements Serializer<Enum<?>, String> {
336369
private final Class<? extends Enum<?>> cls;
337370

338371
public EnumSerializer(Class<? extends Enum<?>> cls) {
339-
this.cls = Validator.requireNonNull(cls, "enum class");
372+
this.cls = requireNonNull(cls, "enum class");
340373
}
341374

342375
@Override
@@ -383,7 +416,7 @@ public CollectionSerializer(
383416
Supplier<L> lSupplier,
384417
Supplier<R> rSupplier
385418
) {
386-
this.serializer = Validator.requireNonNull(serializer, "element serializer");
419+
this.serializer = requireNonNull(serializer, "element serializer");
387420
this.outputNulls = outputNulls;
388421
this.inputNulls = inputNulls;
389422
this.lSupplier = lSupplier;
@@ -441,8 +474,8 @@ public MapSerializer(
441474
boolean outputNulls,
442475
boolean inputNulls
443476
) {
444-
this.keySerializer = Validator.requireNonNull(keySerializer, "key serializer");
445-
this.valSerializer = Validator.requireNonNull(valSerializer, "value serializer");
477+
this.keySerializer = requireNonNull(keySerializer, "key serializer");
478+
this.valSerializer = requireNonNull(valSerializer, "value serializer");
446479
this.outputNulls = outputNulls;
447480
this.inputNulls = inputNulls;
448481
}
@@ -504,8 +537,8 @@ public ArraySerializer(
504537
boolean outputNulls,
505538
boolean inputNulls
506539
) {
507-
this.componentType = Validator.requireNonNull(componentType, "component type");
508-
this.serializer = Validator.requireNonNull(serializer, "element serializer");
540+
this.componentType = requireNonNull(componentType, "component type");
541+
this.serializer = requireNonNull(serializer, "element serializer");
509542
this.outputNulls = outputNulls;
510543
this.inputNulls = inputNulls;
511544
}

configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,4 +1043,43 @@ void newCustomSerializerWithContext() {
10431043
assertThat(serializer.context, sameInstance(ctx));
10441044
}
10451045

1046+
static class A {}
1047+
1048+
@Configuration
1049+
static class B {
1050+
int i;
1051+
}
1052+
1053+
record R(int i) {}
1054+
1055+
@Test
1056+
void newSerializerForTypeRequiresValidArguments() {
1057+
final var props = ConfigurationProperties.newBuilder().build();
1058+
1059+
assertThrowsNullPointerException(
1060+
() -> Serializers.newConfigurationTypeSerializer(null, props),
1061+
"configuration type"
1062+
);
1063+
assertThrowsNullPointerException(
1064+
() -> Serializers.newConfigurationTypeSerializer(B.class, null),
1065+
"configuration properties"
1066+
);
1067+
assertThrowsConfigurationException(
1068+
() -> Serializers.newConfigurationTypeSerializer(A.class, props),
1069+
"Class 'A' must be a configuration or record."
1070+
);
1071+
}
1072+
1073+
@Test
1074+
void newConfigurationTypeSerializerReturnsTypeSerializerInstance() {
1075+
final var props = ConfigurationProperties.newBuilder().build();
1076+
assertThat(
1077+
Serializers.newConfigurationTypeSerializer(B.class, props),
1078+
instanceOf(TypeSerializer.class)
1079+
);
1080+
assertThat(
1081+
Serializers.newConfigurationTypeSerializer(R.class, props),
1082+
instanceOf(TypeSerializer.class)
1083+
);
1084+
}
10461085
}

0 commit comments

Comments
 (0)