Skip to content

Commit a744321

Browse files
authored
Expose static factory to create type serializers (#55)
1 parent 5e2fd08 commit a744321

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: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,41 @@
1919
import java.util.stream.IntStream;
2020
import java.util.stream.Stream;
2121

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

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

6395
public NumberSerializer(Class<? extends Number> cls) {
64-
this.cls = Validator.requireNonNull(cls, "number class");
96+
this.cls = requireNonNull(cls, "number class");
6597
Validator.requirePrimitiveOrWrapperNumberType(cls);
6698
}
6799

@@ -336,7 +368,7 @@ static final class EnumSerializer implements Serializer<Enum<?>, String> {
336368
private final Class<? extends Enum<?>> cls;
337369

338370
public EnumSerializer(Class<? extends Enum<?>> cls) {
339-
this.cls = Validator.requireNonNull(cls, "enum class");
371+
this.cls = requireNonNull(cls, "enum class");
340372
}
341373

342374
@Override
@@ -383,7 +415,7 @@ public CollectionSerializer(
383415
Supplier<L> lSupplier,
384416
Supplier<R> rSupplier
385417
) {
386-
this.serializer = Validator.requireNonNull(serializer, "element serializer");
418+
this.serializer = requireNonNull(serializer, "element serializer");
387419
this.outputNulls = outputNulls;
388420
this.inputNulls = inputNulls;
389421
this.lSupplier = lSupplier;
@@ -441,8 +473,8 @@ public MapSerializer(
441473
boolean outputNulls,
442474
boolean inputNulls
443475
) {
444-
this.keySerializer = Validator.requireNonNull(keySerializer, "key serializer");
445-
this.valSerializer = Validator.requireNonNull(valSerializer, "value serializer");
476+
this.keySerializer = requireNonNull(keySerializer, "key serializer");
477+
this.valSerializer = requireNonNull(valSerializer, "value serializer");
446478
this.outputNulls = outputNulls;
447479
this.inputNulls = inputNulls;
448480
}
@@ -504,8 +536,8 @@ public ArraySerializer(
504536
boolean outputNulls,
505537
boolean inputNulls
506538
) {
507-
this.componentType = Validator.requireNonNull(componentType, "component type");
508-
this.serializer = Validator.requireNonNull(serializer, "element serializer");
539+
this.componentType = requireNonNull(componentType, "component type");
540+
this.serializer = requireNonNull(serializer, "element serializer");
509541
this.outputNulls = outputNulls;
510542
this.inputNulls = inputNulls;
511543
}

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

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

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

0 commit comments

Comments
 (0)