From 23ba8f2f011fa7a8ae04973babf9c22de36788d3 Mon Sep 17 00:00:00 2001 From: Exlll Date: Wed, 17 Dec 2025 23:10:06 +0100 Subject: [PATCH] Expose static factory to create type serializers --- .../java/de/exlll/configlib/Serializers.java | 48 +++++++++++++++---- .../de/exlll/configlib/SerializersTest.java | 40 ++++++++++++++++ 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/configlib-core/src/main/java/de/exlll/configlib/Serializers.java b/configlib-core/src/main/java/de/exlll/configlib/Serializers.java index 74d1734..742b8dd 100644 --- a/configlib-core/src/main/java/de/exlll/configlib/Serializers.java +++ b/configlib-core/src/main/java/de/exlll/configlib/Serializers.java @@ -19,9 +19,41 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -final class Serializers { +import static de.exlll.configlib.Validator.*; + +/** + * Class that contains static factory methods for the creation of {@code Serializer}s. + */ +public final class Serializers { private Serializers() {} + /** + * Creates a new serializer that converts instances of the given configuration type + * to {@code Map}s of valid target types. + *

+ * The serializer returned by this method respects most configuration properties of + * the given properties object. The following properties are ignored: + * - All properties of subclasses of the configuration properties object + * - Properties affecting environment variable resolution + * + * @param configurationType the type of configurations the newly created serializer + * can convert + * @param properties the configuration properties the serializer will use + * @param the configuration type + * @return newly created serializer + * @throws NullPointerException if any argument is null + * @throws ConfigurationException if {@code type} is not a configuration type + */ + public static Serializer> newSerializerForType( + Class configurationType, + ConfigurationProperties properties + ) { + requireNonNull(configurationType, "configuration type"); + requireNonNull(properties, "configuration properties"); + requireConfigurationType(configurationType); + return TypeSerializer.newSerializerFor(configurationType, properties); + } + static > S newCustomSerializer( Class serializerType, SerializerContext context @@ -61,7 +93,7 @@ static final class NumberSerializer implements Serializer { private final Class cls; public NumberSerializer(Class cls) { - this.cls = Validator.requireNonNull(cls, "number class"); + this.cls = requireNonNull(cls, "number class"); Validator.requirePrimitiveOrWrapperNumberType(cls); } @@ -336,7 +368,7 @@ static final class EnumSerializer implements Serializer, String> { private final Class> cls; public EnumSerializer(Class> cls) { - this.cls = Validator.requireNonNull(cls, "enum class"); + this.cls = requireNonNull(cls, "enum class"); } @Override @@ -383,7 +415,7 @@ public CollectionSerializer( Supplier lSupplier, Supplier rSupplier ) { - this.serializer = Validator.requireNonNull(serializer, "element serializer"); + this.serializer = requireNonNull(serializer, "element serializer"); this.outputNulls = outputNulls; this.inputNulls = inputNulls; this.lSupplier = lSupplier; @@ -441,8 +473,8 @@ public MapSerializer( boolean outputNulls, boolean inputNulls ) { - this.keySerializer = Validator.requireNonNull(keySerializer, "key serializer"); - this.valSerializer = Validator.requireNonNull(valSerializer, "value serializer"); + this.keySerializer = requireNonNull(keySerializer, "key serializer"); + this.valSerializer = requireNonNull(valSerializer, "value serializer"); this.outputNulls = outputNulls; this.inputNulls = inputNulls; } @@ -504,8 +536,8 @@ public ArraySerializer( boolean outputNulls, boolean inputNulls ) { - this.componentType = Validator.requireNonNull(componentType, "component type"); - this.serializer = Validator.requireNonNull(serializer, "element serializer"); + this.componentType = requireNonNull(componentType, "component type"); + this.serializer = requireNonNull(serializer, "element serializer"); this.outputNulls = outputNulls; this.inputNulls = inputNulls; } diff --git a/configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java b/configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java index 90dcf57..b5541b8 100644 --- a/configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java +++ b/configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java @@ -1043,4 +1043,44 @@ void newCustomSerializerWithContext() { assertThat(serializer.context, sameInstance(ctx)); } + + static class A {} + + @Configuration + static class B { + int i; + } + + record R(int i) {} + + @Test + void newSerializerForTypeRequiresValidArguments() { + final var props = ConfigurationProperties.newBuilder().build(); + + assertThrowsNullPointerException( + () -> Serializers.newSerializerForType(null, props), + "configuration type" + ); + assertThrowsNullPointerException( + () -> Serializers.newSerializerForType(B.class, null), + "configuration properties" + ); + assertThrowsConfigurationException( + () -> Serializers.newSerializerForType(A.class, props), + "Class 'A' must be a configuration or record." + ); + } + + @Test + void newSerializerForTypeReturnsTypeSerializerInstance() { + final var props = ConfigurationProperties.newBuilder().build(); + assertThat( + Serializers.newSerializerForType(B.class, props), + instanceOf(TypeSerializer.class) + ); + assertThat( + Serializers.newSerializerForType(R.class, props), + instanceOf(TypeSerializer.class) + ); + } } \ No newline at end of file