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 extends Number> cls;
public NumberSerializer(Class extends Number> 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 extends Enum>> cls;
public EnumSerializer(Class extends Enum>> 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