Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions configlib-core/src/main/java/de/exlll/configlib/Serializers.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
* <p>
* 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 <T> 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 <T> Serializer<T, Map<?, ?>> newSerializerForType(
Class<T> configurationType,
ConfigurationProperties properties
) {
requireNonNull(configurationType, "configuration type");
requireNonNull(properties, "configuration properties");
requireConfigurationType(configurationType);
return TypeSerializer.newSerializerFor(configurationType, properties);
}

static <S extends Serializer<?, ?>> S newCustomSerializer(
Class<S> serializerType,
SerializerContext context
Expand Down Expand Up @@ -61,7 +93,7 @@ static final class NumberSerializer implements Serializer<Number, Number> {
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);
}

Expand Down Expand Up @@ -336,7 +368,7 @@ static final class EnumSerializer implements Serializer<Enum<?>, 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
Expand Down Expand Up @@ -383,7 +415,7 @@ public CollectionSerializer(
Supplier<L> lSupplier,
Supplier<R> rSupplier
) {
this.serializer = Validator.requireNonNull(serializer, "element serializer");
this.serializer = requireNonNull(serializer, "element serializer");
this.outputNulls = outputNulls;
this.inputNulls = inputNulls;
this.lSupplier = lSupplier;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
);
}
}