1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2026-06-05 02:58:20 +08:00

feat!(value): Finished the standard configured values

This commit is contained in:
2025-02-02 23:59:13 +08:00
parent 8ac1faf300
commit 205db6e5b9
23 changed files with 335 additions and 852 deletions
@@ -24,10 +24,10 @@ public class ValueAdapter<TYPE>
public ValueAdapter(@NotNull ValueType<TYPE> type,
@Nullable ValueSerializer<TYPE> serializer,
@Nullable ValueParser<TYPE> deserializer) {
@Nullable ValueParser<TYPE> parser) {
this.type = type;
this.serializer = serializer;
this.deserializer = deserializer;
this.deserializer = parser;
}
public @NotNull ValueType<TYPE> type() {
@@ -42,12 +42,14 @@ public class ValueAdapter<TYPE>
return deserializer;
}
public void serializer(@Nullable ValueSerializer<TYPE> serializer) {
public ValueAdapter<TYPE> serializer(@Nullable ValueSerializer<TYPE> serializer) {
this.serializer = serializer;
return this;
}
public void parser(@Nullable ValueParser<TYPE> deserializer) {
public ValueAdapter<TYPE> parser(@Nullable ValueParser<TYPE> deserializer) {
this.deserializer = deserializer;
return this;
}
@Override
@@ -1,5 +1,6 @@
package cc.carm.lib.configuration.builder;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.source.ConfigurationProvider;
import cc.carm.lib.configuration.value.ConfigValue;
import cc.carm.lib.configuration.value.ValueManifest;
@@ -8,44 +9,53 @@ import org.jetbrains.annotations.Nullable;
import java.util.function.Supplier;
public abstract class AbstractConfigBuilder<T, B extends AbstractConfigBuilder<T, B, P>, P extends ConfigurationProvider<?>> {
public abstract class AbstractConfigBuilder<
TYPE, RESULT extends ConfigValue<TYPE>, PROVIDER extends ConfigurationProvider<?>,
SELF extends AbstractConfigBuilder<TYPE, RESULT, PROVIDER, SELF>
> {
protected final Class<? super P> providerClass;
protected final Class<? super PROVIDER> providerClass;
protected final ValueType<TYPE> type;
protected @Nullable P provider;
protected @Nullable PROVIDER provider;
protected @Nullable String path;
protected @NotNull Supplier<T> defaultValueSupplier = () -> null;
protected @NotNull Supplier<TYPE> defaultValueSupplier = () -> null;
protected AbstractConfigBuilder(Class<? super P> providerClass) {
protected AbstractConfigBuilder(Class<? super PROVIDER> providerClass, ValueType<TYPE> type) {
this.providerClass = providerClass;
this.type = type;
}
protected abstract @NotNull B self();
public @NotNull ValueType<TYPE> type() {
return type;
}
public abstract @NotNull ConfigValue<?> build();
protected abstract @NotNull SELF self();
public @NotNull B from(@Nullable P provider) {
public abstract @NotNull RESULT build();
public @NotNull SELF from(@Nullable PROVIDER provider) {
this.provider = provider;
return self();
}
public @NotNull B path(@Nullable String path) {
public @NotNull SELF path(@Nullable String path) {
this.path = path;
return self();
}
public @NotNull B defaults(@Nullable T defaultValue) {
public @NotNull SELF defaults(@Nullable TYPE defaultValue) {
return defaults(() -> defaultValue);
}
public @NotNull B defaults(@NotNull Supplier<@Nullable T> supplier) {
public @NotNull SELF defaults(@NotNull Supplier<@Nullable TYPE> supplier) {
this.defaultValueSupplier = supplier;
return self();
}
protected @NotNull ValueManifest<T> buildManifest() {
return null;
protected @NotNull ValueManifest<TYPE> buildManifest() {
return new ValueManifest<>(type(), this.provider, this.path, this.defaultValueSupplier);
}
}
@@ -1,12 +1,14 @@
package cc.carm.lib.configuration.builder;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.source.ConfigurationProvider;
import cc.carm.lib.configuration.value.ConfigValue;
public abstract class CommonConfigBuilder<T, B extends CommonConfigBuilder<T, B>>
extends AbstractConfigBuilder<T, B, ConfigurationProvider<?>> {
public abstract class CommonConfigBuilder<TYPE, RESULT extends ConfigValue<TYPE>, SELF extends CommonConfigBuilder<TYPE, RESULT, SELF>>
extends AbstractConfigBuilder<TYPE, RESULT, ConfigurationProvider<?>, SELF> {
protected CommonConfigBuilder() {
super(ConfigurationProvider.class);
protected CommonConfigBuilder(ValueType<TYPE> type) {
super(ConfigurationProvider.class, type);
}
}
@@ -0,0 +1,74 @@
package cc.carm.lib.configuration.builder.impl;
import cc.carm.lib.configuration.adapter.ValueAdapter;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.source.section.ConfigurationSection;
import cc.carm.lib.configuration.value.ConfigValue;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
public abstract class AbstractSectionBuilder<
TYPE, PARAM,
RESULT extends ConfigValue<TYPE>,
SELF extends AbstractSectionBuilder<TYPE, PARAM, RESULT, SELF>
> extends CommonConfigBuilder<TYPE, RESULT, SELF> {
protected final @NotNull ValueType<PARAM> paramType;
protected @NotNull ConfigValueHandler<ConfigurationSection, PARAM> parser;
protected @NotNull ConfigValueHandler<PARAM, ? extends Map<Object, Object>> serializer;
public AbstractSectionBuilder(@NotNull ValueType<TYPE> type, @NotNull ValueType<PARAM> paramType,
@NotNull ConfigValueHandler<ConfigurationSection, PARAM> parser,
@NotNull ConfigValueHandler<PARAM, ? extends Map<Object, Object>> serializer) {
super(type);
this.paramType = paramType;
this.parser = parser;
this.serializer = serializer;
}
public @NotNull SELF parse(ConfigDataFunction<ConfigurationSection, PARAM> valueParser) {
return parse((p, section) -> valueParser.handle(section));
}
public @NotNull SELF parse(ConfigValueHandler<ConfigurationSection, PARAM> valueParser) {
this.parser = valueParser;
return self();
}
public @NotNull SELF serialize(ConfigDataFunction<PARAM, ? extends Map<Object, Object>> serializer) {
return serialize((p, value) -> serializer.handle(value));
}
public @NotNull SELF serialize(ConfigValueHandler<PARAM, ? extends Map<Object, Object>> serializer) {
this.serializer = serializer;
return self();
}
public @NotNull SELF serialize(Consumer<Map<Object, Object>> serializer) {
return serialize((p, value) -> {
Map<Object, Object> map = new LinkedHashMap<>();
serializer.accept(map);
return map;
});
}
protected ValueAdapter<PARAM> buildAdapter() {
return new ValueAdapter<>(this.paramType)
.parser((p, type, data) -> {
ConfigurationSection section = p.deserialize(ConfigurationSection.class, data);
if (section == null) return null;
return this.parser.handle(p, section);
})
.serializer((p, type, data) -> {
Map<Object, Object> map = this.serializer.handle(p, data);
return map == null || map.isEmpty() ? null : map;
});
}
}
@@ -0,0 +1,63 @@
package cc.carm.lib.configuration.builder.impl;
import cc.carm.lib.configuration.adapter.ValueAdapter;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.value.ConfigValue;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractSourceBuilder<
V, SOURCE, PARAM, RESULT extends ConfigValue<V>,
SELF extends AbstractSourceBuilder<V, SOURCE, PARAM, RESULT, SELF>
> extends CommonConfigBuilder<V, RESULT, SELF> {
protected final @NotNull ValueType<SOURCE> sourceType;
protected final @NotNull ValueType<PARAM> paramType;
protected @NotNull ConfigValueHandler<SOURCE, PARAM> valueParser;
protected @NotNull ConfigValueHandler<PARAM, SOURCE> valueSerializer;
public AbstractSourceBuilder(@NotNull ValueType<V> type,
@NotNull ValueType<SOURCE> sourceType, @NotNull ValueType<PARAM> paramType,
@NotNull ConfigValueHandler<SOURCE, PARAM> parser,
@NotNull ConfigValueHandler<PARAM, SOURCE> serializer) {
super(type);
this.sourceType = sourceType;
this.paramType = paramType;
this.valueParser = parser;
this.valueSerializer = serializer;
}
public @NotNull SELF parse(ConfigDataFunction<SOURCE, PARAM> parser) {
return parse((p, source) -> parser.handle(source));
}
public @NotNull SELF parse(@NotNull ConfigValueHandler<SOURCE, PARAM> parser) {
this.valueParser = parser;
return self();
}
public @NotNull SELF serialize(@NotNull ConfigValueHandler<PARAM, SOURCE> serializer) {
this.valueSerializer = serializer;
return self();
}
public @NotNull SELF serialize(@NotNull ConfigDataFunction<PARAM, SOURCE> serializer) {
return serialize((p, value) -> serializer.handle(value));
}
protected ValueAdapter<PARAM> buildAdapter() {
return new ValueAdapter<>(this.paramType)
.parser((p, type, data) -> {
SOURCE source = p.deserialize(this.sourceType, data);
return this.valueParser.handle(p, source);
})
.serializer((p, type, data) -> {
SOURCE source = this.valueSerializer.handle(p, data);
return p.serialize(source);
});
}
}
@@ -0,0 +1,34 @@
package cc.carm.lib.configuration.builder.list;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
public class ConfigListBuilder<V> {
protected final @NotNull ValueType<V> type;
public ConfigListBuilder(@NotNull ValueType<V> type) {
this.type = type;
}
public <S> @NotNull SourceListBuilder<S, V> from(@NotNull Class<S> sourceType) {
return from(ValueType.of(sourceType));
}
public <S> @NotNull SourceListBuilder<S, V> from(@NotNull ValueType<S> sourceType) {
return new SourceListBuilder<>(sourceType, type, ConfigValueHandler.required(), ConfigValueHandler.required(), ArrayList::new);
}
public @NotNull SourceListBuilder<String, V> fromString() {
return from(String.class);
}
public @NotNull SectionListBuilder<V> fromSection() {
return new SectionListBuilder<>(type, ConfigValueHandler.required(), ConfigValueHandler.required(), ArrayList::new);
}
}
@@ -0,0 +1,53 @@
package cc.carm.lib.configuration.builder.list;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.source.section.ConfigurationSection;
import cc.carm.lib.configuration.value.standard.ConfiguredList;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.function.Supplier;
public class SectionListBuilder<V> extends AbstractSectionBuilder<List<V>, V, ConfiguredList<V>, SectionListBuilder<V>> {
protected @NotNull Supplier<? extends List<V>> constructor;
public SectionListBuilder(@NotNull ValueType<V> paramType,
@NotNull ConfigValueHandler<ConfigurationSection, V> parser,
@NotNull ConfigValueHandler<V, ? extends Map<Object, Object>> serializer,
@NotNull Supplier<? extends List<V>> constructor) {
super(new ValueType<List<V>>() {
}, paramType, parser, serializer);
this.constructor = constructor;
}
@SafeVarargs
public final @NotNull SectionListBuilder<V> defaults(@NotNull V... values) {
return defaults(new ArrayList<>(Arrays.asList(values)));
}
public final @NotNull SectionListBuilder<V> defaults(@NotNull Collection<V> values) {
return defaults(new ArrayList<>(values));
}
public SectionListBuilder<V> constructor(@NotNull Supplier<? extends List<V>> constructor) {
this.constructor = constructor;
return this;
}
public <LIST extends List<V>> SectionListBuilder<V> construct(@NotNull LIST list) {
return constructor(() -> list);
}
@Override
protected @NotNull SectionListBuilder<V> self() {
return this;
}
@Override
public @NotNull ConfiguredList<V> build() {
return new ConfiguredList<>(buildManifest(), constructor, buildAdapter());
}
}
@@ -0,0 +1,47 @@
package cc.carm.lib.configuration.builder.list;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.impl.AbstractSourceBuilder;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.value.standard.ConfiguredList;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
public class SourceListBuilder<SOURCE, V>
extends AbstractSourceBuilder<List<V>, SOURCE, V, ConfiguredList<V>, SourceListBuilder<SOURCE, V>> {
protected @NotNull Supplier<? extends List<V>> constructor;
public SourceListBuilder(@NotNull ValueType<SOURCE> sourceType, @NotNull ValueType<V> paramType,
@NotNull ConfigValueHandler<SOURCE, V> parser, @NotNull ConfigValueHandler<V, SOURCE> serializer,
@NotNull Supplier<? extends List<V>> constructor) {
super(new ValueType<List<V>>() {
}, sourceType, paramType, parser, serializer);
this.constructor = constructor;
}
@SafeVarargs
public final @NotNull SourceListBuilder<SOURCE, V> defaults(@NotNull V... values) {
return defaults(new ArrayList<>(Arrays.asList(values)));
}
public final @NotNull SourceListBuilder<SOURCE, V> defaults(@NotNull Collection<V> values) {
return defaults(new ArrayList<>(values));
}
@Override
protected @NotNull SourceListBuilder<SOURCE, V> self() {
return this;
}
@Override
public @NotNull ConfiguredList<V> build() {
return new ConfiguredList<>(buildManifest(), this.constructor, buildAdapter());
}
}
@@ -1,7 +1,6 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.source.section.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
@@ -17,11 +16,11 @@ public class ConfigValueBuilder<V> {
}
public @NotNull <S> SourceValueBuilder<S, V> from(@NotNull Class<S> clazz) {
return new SourceValueBuilder<>(ValueType.of(clazz), this.type);
return from(ValueType.of(clazz));
}
public @NotNull <S> SourceValueBuilder<S, V> from(@NotNull ValueType<S> sourceType) {
return new SourceValueBuilder<>(sourceType, this.type);
return from(sourceType, ConfigValueHandler.required(), ConfigValueHandler.required());
}
public @NotNull <S> SourceValueBuilder<S, V> from(@NotNull ValueType<S> sourceType,
@@ -35,11 +34,13 @@ public class ConfigValueBuilder<V> {
}
public @NotNull SectionValueBuilder<V> fromSection() {
return new SectionValueBuilder<>(this.type);
return fromSection(ConfigValueHandler.required(), ConfigValueHandler.required());
}
public @NotNull SectionValueBuilder<V> fromSection(@NotNull ConfigValueHandler<ConfigurationSection, V> valueParser,
@NotNull ConfigValueHandler<V, ? extends Map<Object, Object>> valueSerializer) {
public @NotNull SectionValueBuilder<V> fromSection(
@NotNull ConfigValueHandler<ConfigurationSection, V> valueParser,
@NotNull ConfigValueHandler<V, ? extends Map<Object, Object>> valueSerializer
) {
return new SectionValueBuilder<>(this.type, valueParser, valueSerializer);
}
@@ -1,34 +1,20 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.source.section.ConfigurationSection;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
public class SectionValueBuilder<V> extends CommonConfigBuilder<V, SectionValueBuilder<V>> {
public class SectionValueBuilder<V> extends AbstractSectionBuilder<V, V, ConfiguredValue<V>, SectionValueBuilder<V>> {
protected final @NotNull ValueType<V> valueType;
protected @NotNull ConfigValueHandler<ConfigurationSection, V> parser;
protected @NotNull ConfigValueHandler<V, ? extends Map<Object, Object>> serializer;
public SectionValueBuilder(@NotNull ValueType<V> valueType) {
this(valueType, ConfigValueHandler.required(), ConfigValueHandler.required());
}
public SectionValueBuilder(@NotNull ValueType<V> valueType,
public SectionValueBuilder(@NotNull ValueType<V> type,
@NotNull ConfigValueHandler<ConfigurationSection, V> parser,
@NotNull ConfigValueHandler<V, ? extends Map<Object, Object>> serializer) {
this.valueType = valueType;
this.parser = parser;
this.serializer = serializer;
super(type, type, parser, serializer);
}
@Override
@@ -36,46 +22,9 @@ public class SectionValueBuilder<V> extends CommonConfigBuilder<V, SectionValueB
return this;
}
public @NotNull SectionValueBuilder<V> parse(ConfigDataFunction<ConfigurationSection, V> valueParser) {
return parse((p, section) -> valueParser.handle(section));
}
public @NotNull SectionValueBuilder<V> parse(ConfigValueHandler<ConfigurationSection, V> valueParser) {
this.parser = valueParser;
return this;
}
public @NotNull SectionValueBuilder<V> serialize(ConfigDataFunction<V, ? extends Map<Object, Object>> serializer) {
return serialize((p, value) -> serializer.handle(value));
}
public @NotNull SectionValueBuilder<V> serialize(ConfigValueHandler<V, ? extends Map<Object, Object>> serializer) {
this.serializer = serializer;
return this;
}
public @NotNull SectionValueBuilder<V> serialize(Consumer<Map<Object, Object>> serializer) {
return serialize((p, value) -> {
Map<Object, Object> map = new LinkedHashMap<>();
serializer.accept(map);
return map;
});
}
@Override
public @NotNull ConfiguredValue<V> build() {
return ConfiguredValue.of(
buildManifest(),
(p, type, data) -> {
ConfigurationSection section = p.deserialize(ConfigurationSection.class, data);
if (section == null) return null;
return this.parser.handle(p, section);
},
(p, type, data) -> {
Map<Object, Object> map = this.serializer.handle(p, data);
return map == null || map.isEmpty() ? null : map; // Map is a type of original data
}
);
return ConfiguredValue.of(buildManifest(), buildAdapter());
}
}
@@ -1,30 +1,17 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.builder.impl.AbstractSourceBuilder;
import cc.carm.lib.configuration.function.ConfigValueHandler;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import org.jetbrains.annotations.NotNull;
public class SourceValueBuilder<S, V> extends CommonConfigBuilder<V, SourceValueBuilder<S, V>> {
public class SourceValueBuilder<S, V> extends AbstractSourceBuilder<V, S, V, ConfiguredValue<V>, SourceValueBuilder<S, V>> {
protected final @NotNull ValueType<S> sourceType;
protected final @NotNull ValueType<V> valueType;
protected @NotNull ConfigValueHandler<S, V> valueParser;
protected @NotNull ConfigValueHandler<V, S> valueSerializer;
public SourceValueBuilder(@NotNull ValueType<S> sourceType, @NotNull ValueType<V> valueType) {
this(sourceType, valueType, ConfigValueHandler.required(), ConfigValueHandler.required());
}
public SourceValueBuilder(@NotNull ValueType<S> sourceType, @NotNull ValueType<V> valueType,
@NotNull ConfigValueHandler<S, V> valueParser,
@NotNull ConfigValueHandler<V, S> valueSerializer) {
this.sourceType = sourceType;
this.valueType = valueType;
this.valueParser = valueParser;
this.valueSerializer = valueSerializer;
@NotNull ConfigValueHandler<S, V> parser, @NotNull ConfigValueHandler<V, S> serializer) {
super(valueType, sourceType, valueType, parser, serializer);
}
@Override
@@ -32,37 +19,9 @@ public class SourceValueBuilder<S, V> extends CommonConfigBuilder<V, SourceValue
return this;
}
public @NotNull SourceValueBuilder<S, V> parse(ConfigDataFunction<S, V> parser) {
return parse((p, source) -> parser.handle(source));
}
public @NotNull SourceValueBuilder<S, V> parse(@NotNull ConfigValueHandler<S, V> parser) {
this.valueParser = parser;
return this;
}
public @NotNull SourceValueBuilder<S, V> serialize(@NotNull ConfigValueHandler<V, S> serializer) {
this.valueSerializer = serializer;
return this;
}
public @NotNull SourceValueBuilder<S, V> serialize(@NotNull ConfigDataFunction<V, S> serializer) {
return serialize((p, value) -> serializer.handle(value));
}
@Override
public @NotNull ConfiguredValue<V> build() {
return ConfiguredValue.of(
buildManifest(),
(p, type, data) -> {
S source = p.deserialize(this.sourceType, data);
return this.valueParser.handle(p, source);
},
(p, type, value) -> {
S source = this.valueSerializer.handle(p, value);
return p.serialize(source);
}
);
return new ConfiguredValue<>(buildManifest(), buildAdapter());
}
}
@@ -4,6 +4,7 @@ import cc.carm.lib.configuration.adapter.ValueAdapter;
import cc.carm.lib.configuration.adapter.ValueParser;
import cc.carm.lib.configuration.adapter.ValueSerializer;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.list.ConfigListBuilder;
import cc.carm.lib.configuration.value.ValueManifest;
import cc.carm.lib.configuration.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
@@ -16,12 +17,20 @@ import java.util.function.Supplier;
public class ConfiguredList<V> extends CachedConfigValue<List<V>> implements List<V> {
public static <T> @NotNull ConfigListBuilder<T> builderOf(@NotNull Class<T> type) {
return builderOf(ValueType.of(type));
}
public static <T> @NotNull ConfigListBuilder<T> builderOf(@NotNull ValueType<T> type) {
return new ConfigListBuilder<>(type);
}
protected final @NotNull Supplier<? extends List<V>> constructor;
protected final @NotNull ValueAdapter<V> paramAdapter;
private ConfiguredList(@NotNull ValueManifest<List<V>> manifest,
@NotNull Supplier<? extends List<V>> constructor,
@NotNull ValueAdapter<V> paramAdapter) {
public ConfiguredList(@NotNull ValueManifest<List<V>> manifest,
@NotNull Supplier<? extends List<V>> constructor,
@NotNull ValueAdapter<V> paramAdapter) {
super(manifest);
this.constructor = constructor;
this.paramAdapter = paramAdapter;
@@ -1,76 +0,0 @@
package cc.carm.lib.configuration.builder;
import cc.carm.lib.configuration.value.ConfigValue;
import cc.carm.lib.configuration.value.ValueManifest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
public abstract class AbstractConfigBuilder<T, B extends AbstractConfigBuilder<T, B, P>, P extends ConfigurationProvider<?>> {
protected final Class<? super P> providerClass;
protected @Nullable P provider;
protected @Nullable String path;
protected @Nullable List<String> headerComments;
protected @Nullable String inlineComment;
protected @Nullable T defaultValue;
protected AbstractConfigBuilder(Class<? super P> providerClass) {
this.providerClass = providerClass;
}
protected abstract @NotNull B getThis();
public abstract @NotNull ConfigValue<?> build();
public @NotNull B from(@Nullable P provider) {
this.provider = provider;
return self();
}
public @NotNull B path(@Nullable String path) {
this.path = path;
return self();
}
public @NotNull B comments(@NotNull String... comments) {
return headerComments(comments);
}
public @NotNull B headerComments(@NotNull String... comments) {
return headerComments(Arrays.asList(comments));
}
public @NotNull B headerComments(@NotNull List<String> comments) {
this.headerComments = comments;
return self();
}
public @NotNull B inlineComment(@NotNull String comment) {
this.inlineComment = comment;
return self();
}
public @NotNull B defaults(@Nullable T defaultValue) {
this.defaultValue = defaultValue;
return self();
}
public @NotNull B defaults(@NotNull Supplier<@Nullable T> defaultValueSupplier) {
return defaults(defaultValueSupplier.get());
}
protected @NotNull ValueManifest<T> buildManifest() {
return ValueManifest.of(
this.provider, this.path,
this.headerComments, this.inlineComment, this.defaultValue
);
}
}
@@ -1,10 +0,0 @@
package cc.carm.lib.configuration.builder;
public abstract class CommonConfigBuilder<T, B extends CommonConfigBuilder<T, B>>
extends AbstractConfigBuilder<T, B, ConfigurationProvider<?>> {
protected CommonConfigBuilder() {
super(ConfigurationProvider.class);
}
}
@@ -1,58 +0,0 @@
package cc.carm.lib.configuration.builder.list;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class ConfigListBuilder<V> {
protected final @NotNull Class<V> valueClass;
public ConfigListBuilder(@NotNull Class<V> valueClass) {
this.valueClass = valueClass;
}
public @NotNull <S> SourceListBuilder<S, V> from(@NotNull Class<? super S> sourceClass,
@NotNull ConfigDataFunction<Object, S> sourceParser,
@NotNull ConfigDataFunction<S, V> valueParser,
@NotNull ConfigDataFunction<V, S> valueSerializer,
@NotNull ConfigDataFunction<S, Object> sourceSerializer) {
return new SourceListBuilder<>(sourceClass, sourceParser, this.valueClass, valueParser, valueSerializer, sourceSerializer);
}
public @NotNull <S> SourceListBuilder<S, V> from(Class<S> sourceClass) {
return from(sourceClass,
ConfigDataFunction.required(), ConfigDataFunction.required(),
ConfigDataFunction.required(), ConfigDataFunction.required()
);
}
public @NotNull SourceListBuilder<Object, V> fromObject() {
return from(
Object.class, ConfigDataFunction.identity(),
ConfigDataFunction.castObject(valueClass),
ConfigDataFunction.toObject(), ConfigDataFunction.toObject()
);
}
public @NotNull SourceListBuilder<String, V> fromString() {
return from(
String.class, ConfigDataFunction.castToString(),
ConfigDataFunction.castFromString(this.valueClass),
ConfigDataFunction.castToString(), ConfigDataFunction.toObject()
);
}
public @NotNull SourceListBuilder<Map<String, Object>, V> fromMap() {
return from(
Map.class, obj -> (Map<String, Object>) obj,
ConfigDataFunction.required(),
ConfigDataFunction.required(),
ConfigDataFunction.toObject()
);
}
}
@@ -1,80 +0,0 @@
package cc.carm.lib.configuration.builder.list;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.value.standard.ConfiguredList;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, SourceListBuilder<S, V>> {
protected final @NotNull Class<? super S> sourceClass;
protected @NotNull ConfigDataFunction<Object, S> sourceParser;
protected final @NotNull Class<V> valueClass;
protected @NotNull ConfigDataFunction<S, V> valueParser;
protected @NotNull ConfigDataFunction<V, S> valueSerializer;
protected @NotNull ConfigDataFunction<S, Object> sourceSerializer;
public SourceListBuilder(@NotNull Class<? super S> sourceClass, @NotNull ConfigDataFunction<Object, S> sourceParser,
@NotNull Class<V> valueClass, @NotNull ConfigDataFunction<S, V> valueParser,
@NotNull ConfigDataFunction<V, S> valueSerializer,
@NotNull ConfigDataFunction<S, Object> sourceSerializer) {
this.sourceClass = sourceClass;
this.sourceParser = sourceParser;
this.sourceSerializer = sourceSerializer;
this.valueClass = valueClass;
this.valueParser = valueParser;
this.valueSerializer = valueSerializer;
}
@SafeVarargs
public final @NotNull SourceListBuilder<S, V> defaults(@NotNull V... values) {
return defaults(new ArrayList<>(Arrays.asList(values)));
}
public final @NotNull SourceListBuilder<S, V> defaults(@NotNull Collection<V> values) {
return defaults(new ArrayList<>(values));
}
public @NotNull SourceListBuilder<S, V> parseSource(ConfigDataFunction<Object, S> sourceParser) {
this.sourceParser = sourceParser;
return this;
}
public @NotNull SourceListBuilder<S, V> parseValue(ConfigDataFunction<S, V> valueParser) {
this.valueParser = valueParser;
return this;
}
public @NotNull SourceListBuilder<S, V> serializeValue(ConfigDataFunction<V, S> serializer) {
this.valueSerializer = serializer;
return this;
}
public @NotNull SourceListBuilder<S, V> serializeSource(ConfigDataFunction<S, Object> serializer) {
this.sourceSerializer = serializer;
return this;
}
@Override
protected @NotNull SourceListBuilder<S, V> getThis() {
return this;
}
@Override
public @NotNull ConfiguredList<V> build() {
return new ConfiguredList<>(
buildManifest(), this.valueClass,
this.sourceParser.andThen(this.valueParser),
this.valueSerializer.andThen(sourceSerializer)
);
}
}
@@ -1,68 +0,0 @@
package cc.carm.lib.configuration.builder.map;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.function.Supplier;
public class ConfigMapBuilder<M extends Map<K, V>, K, V> {
protected final @NotNull Supplier<? extends M> supplier;
protected final @NotNull Class<K> keyClass;
protected final @NotNull Class<V> valueClass;
public ConfigMapBuilder(@NotNull Supplier<? extends M> supplier, @NotNull Class<K> keyClass, @NotNull Class<V> valueClass) {
this.supplier = supplier;
this.keyClass = keyClass;
this.valueClass = valueClass;
}
public <MAP extends Map<K, V>> ConfigMapBuilder<MAP, K, V> supplier(@NotNull Supplier<MAP> supplier) {
return new ConfigMapBuilder<>(supplier, keyClass, valueClass);
}
public <S> SourceMapBuilder<M, S, K, V> from(@NotNull Class<S> sourceClass,
@NotNull ConfigDataFunction<S, V> valueParser,
@NotNull ConfigDataFunction<V, S> valueSerializer) {
return new SourceMapBuilder<>(supplier,
keyClass, ConfigDataFunction.castFromString(this.keyClass), // #String -> key
sourceClass, ConfigDataFunction.castObject(sourceClass), // #Object -> source
valueClass, valueParser, // source -> value
ConfigDataFunction.castToString(), // key -> #String
valueSerializer/*value -> source*/,
ConfigDataFunction.toObject()/* source -> #Object */
);
}
public <S> SourceMapBuilder<M, S, K, V> from(@NotNull Class<S> sourceClass) {
return from(sourceClass, ConfigDataFunction.required(), ConfigDataFunction.required());
}
public SourceMapBuilder<M, String, K, V> fromString(@NotNull ConfigDataFunction<String, V> valueParser) {
return from(String.class, valueParser, ConfigDataFunction.castToString());
}
public SourceMapBuilder<M, String, K, V> fromString() {
return fromString(ConfigDataFunction.castFromString(this.valueClass));
}
public SectionMapBuilder<M, K, V> fromSection() {
return new SectionMapBuilder<>(
supplier,
keyClass, ConfigDataFunction.castFromString(keyClass),
valueClass, ConfigDataFunction.required(),
ConfigDataFunction.castToString(), ConfigDataFunction.required());
}
public SourceMapBuilder<M, Object, K, V> fromObject(@NotNull ConfigDataFunction<Object, V> valueParser) {
return from(Object.class, valueParser, ConfigDataFunction.toObject());
}
public SourceMapBuilder<M, Object, K, V> fromObject() {
return fromObject(ConfigDataFunction.required());
}
}
@@ -1,38 +0,0 @@
package cc.carm.lib.configuration.builder.map;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.function.Supplier;
public class ConfigMapCreator<K, V> {
protected final @NotNull Class<K> keyClass;
protected final @NotNull Class<V> valueClass;
public ConfigMapCreator(@NotNull Class<K> keyClass, @NotNull Class<V> valueClass) {
this.keyClass = keyClass;
this.valueClass = valueClass;
}
public <M extends Map<K, V>> @NotNull ConfigMapBuilder<M, K, V> asMap(Supplier<? extends M> mapSuppler) {
return new ConfigMapBuilder<>(mapSuppler, keyClass, valueClass);
}
public @NotNull ConfigMapBuilder<HashMap<K, V>, K, V> asHashMap() {
return asMap(HashMap::new);
}
public @NotNull ConfigMapBuilder<LinkedHashMap<K, V>, K, V> asLinkedMap() {
return asMap(LinkedHashMap::new);
}
public @NotNull ConfigMapBuilder<TreeMap<K, V>, K, V> asTreeMap() {
return asMap(TreeMap::new);
}
public @NotNull ConfigMapBuilder<TreeMap<K, V>, K, V> asTreeMap(@NotNull Comparator<? super K> comparator) {
return asMap(() -> new TreeMap<>(comparator));
}
}
@@ -1,98 +0,0 @@
package cc.carm.lib.configuration.builder.map;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.value.ValueManifest;
import cc.carm.lib.configuration.value.standard.ConfiguredSectionMap;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class SectionMapBuilder<M extends Map<K, V>, K, V> extends CommonConfigBuilder<M, SectionMapBuilder<M, K, V>> {
protected final @NotNull Supplier<? extends M> supplier;
protected final @NotNull Class<K> keyClass;
protected @NotNull ConfigDataFunction<String, K> keyParser;
protected final @NotNull Class<V> valueClass;
protected @NotNull ConfigDataFunction<ConfigurationWrapper<?>, V> valueParser;
protected @NotNull ConfigDataFunction<K, String> keySerializer;
protected @NotNull ConfigDataFunction<V, ? extends Map<String, Object>> valueSerializer;
public SectionMapBuilder(@NotNull Supplier<? extends M> supplier,
@NotNull Class<K> keyClass, @NotNull ConfigDataFunction<String, K> keyParser,
@NotNull Class<V> valueClass, @NotNull ConfigDataFunction<ConfigurationWrapper<?>, V> valueParser,
@NotNull ConfigDataFunction<K, String> keySerializer,
@NotNull ConfigDataFunction<V, ? extends Map<String, Object>> valueSerializer) {
this.supplier = supplier;
this.keyClass = keyClass;
this.keyParser = keyParser;
this.valueClass = valueClass;
this.valueParser = valueParser;
this.keySerializer = keySerializer;
this.valueSerializer = valueSerializer;
}
public <MAP extends Map<K, V>> SectionMapBuilder<MAP, K, V> supplier(@NotNull Supplier<MAP> supplier) {
return new SectionMapBuilder<>(supplier,
keyClass, keyParser, valueClass, valueParser, keySerializer, valueSerializer
);
}
public @NotNull SectionMapBuilder<M, K, V> defaults(@NotNull Consumer<M> factory) {
M map = supplier.get();
factory.accept(map);
return defaults(map);
}
public @NotNull SectionMapBuilder<M, K, V> parseKey(@NotNull ConfigDataFunction<String, K> parser) {
this.keyParser = parser;
return this;
}
public @NotNull SectionMapBuilder<M, K, V> parseValue(@NotNull ConfigDataFunction<ConfigurationWrapper<?>, V> parser) {
this.valueParser = parser;
return this;
}
public @NotNull SectionMapBuilder<M, K, V> serializeKey(@NotNull ConfigDataFunction<K, String> serializer) {
this.keySerializer = serializer;
return this;
}
public @NotNull SectionMapBuilder<M, K, V> serializeValue(@NotNull ConfigDataFunction<V, ? extends Map<String, Object>> serializer) {
this.valueSerializer = serializer;
return this;
}
public @NotNull SectionMapBuilder<M, K, V> serializeValue(@NotNull BiConsumer<V, Map<String, Object>> serializer) {
return serializeValue(v -> {
Map<String, Object> map = new LinkedHashMap<>();
serializer.accept(v, map);
return map;
});
}
@Override
protected @NotNull SectionMapBuilder<M, K, V> getThis() {
return this;
}
@Override
public @NotNull ConfiguredSectionMap<K, V> build() {
return new ConfiguredSectionMap<>(
new ValueManifest<>(provider, path, headerComments, inlineComment, defaultValue),
this.supplier, this.keyClass, this.keyParser,
this.valueClass, this.valueParser,
this.keySerializer, this.valueSerializer
);
}
}
@@ -1,107 +0,0 @@
package cc.carm.lib.configuration.builder.map;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.value.ValueManifest;
import cc.carm.lib.configuration.value.standard.ConfiguredMap;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class SourceMapBuilder<M extends Map<K, V>, S, K, V> extends CommonConfigBuilder<M, SourceMapBuilder<M, S, K, V>> {
protected final @NotNull Supplier<? extends M> supplier;
protected final @NotNull Class<K> keyClass;
protected @NotNull ConfigDataFunction<String, K> keyParser;
protected final @NotNull Class<S> sourceClass;
protected @NotNull ConfigDataFunction<Object, S> sourceParser;
protected final @NotNull Class<V> valueClass;
protected @NotNull ConfigDataFunction<S, V> valueParser;
protected @NotNull ConfigDataFunction<K, String> keySerializer;
protected @NotNull ConfigDataFunction<V, S> valueSerializer;
protected @NotNull ConfigDataFunction<S, Object> sourceSerializer;
public SourceMapBuilder(@NotNull Supplier<? extends M> supplier,
@NotNull Class<K> keyClass, @NotNull ConfigDataFunction<String, K> keyParser,
@NotNull Class<S> sourceClass, @NotNull ConfigDataFunction<Object, S> sourceParser,
@NotNull Class<V> valueClass, @NotNull ConfigDataFunction<S, V> valueParser,
@NotNull ConfigDataFunction<K, String> keySerializer,
@NotNull ConfigDataFunction<V, S> valueSerializer,
@NotNull ConfigDataFunction<S, Object> sourceSerializer) {
this.supplier = supplier;
this.keyClass = keyClass;
this.keyParser = keyParser;
this.valueClass = valueClass;
this.valueParser = valueParser;
this.sourceClass = sourceClass;
this.sourceParser = sourceParser;
this.keySerializer = keySerializer;
this.valueSerializer = valueSerializer;
this.sourceSerializer = sourceSerializer;
}
public <MAP extends Map<K, V>> SourceMapBuilder<MAP, S, K, V> supplier(@NotNull Supplier<MAP> supplier) {
return new SourceMapBuilder<>(supplier,
keyClass, keyParser, sourceClass, sourceParser, valueClass, valueParser,
keySerializer, valueSerializer, sourceSerializer
);
}
public @NotNull SourceMapBuilder<M, S, K, V> defaults(@NotNull Consumer<M> factory) {
M map = supplier.get();
factory.accept(map);
return defaults(map);
}
public @NotNull SourceMapBuilder<M, S, K, V> parseKey(@NotNull ConfigDataFunction<String, K> parser) {
this.keyParser = parser;
return this;
}
public @NotNull SourceMapBuilder<M, S, K, V> parseSource(@NotNull ConfigDataFunction<Object, S> parser) {
this.sourceParser = parser;
return this;
}
public @NotNull SourceMapBuilder<M, S, K, V> parseValue(@NotNull ConfigDataFunction<S, V> parser) {
this.valueParser = parser;
return this;
}
public @NotNull SourceMapBuilder<M, S, K, V> serializeKey(@NotNull ConfigDataFunction<K, String> serializer) {
this.keySerializer = serializer;
return this;
}
public @NotNull SourceMapBuilder<M, S, K, V> serializeValue(@NotNull ConfigDataFunction<V, S> serializer) {
this.valueSerializer = serializer;
return this;
}
public @NotNull SourceMapBuilder<M, S, K, V> serializeSource(@NotNull ConfigDataFunction<S, Object> serializer) {
this.sourceSerializer = serializer;
return this;
}
@Override
protected @NotNull SourceMapBuilder<M, S, K, V> getThis() {
return this;
}
@Override
public @NotNull ConfiguredMap<K, V> build() {
return new ConfiguredMap<>(
new ValueManifest<>(provider, path, headerComments, inlineComment, defaultValue),
this.supplier, this.keyClass, this.keyParser,
this.valueClass, this.sourceParser.andThen(this.valueParser),
this.keySerializer, this.valueSerializer.andThen(this.sourceSerializer)
);
}
}
@@ -1,63 +0,0 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueParser;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class ConfigValueBuilder<V> {
protected final @NotNull Class<V> valueClass;
public ConfigValueBuilder(@NotNull Class<V> valueClass) {
this.valueClass = valueClass;
}
public @NotNull SectionValueBuilder<V> fromSection() {
return fromSection(ConfigValueParser.required(), ConfigDataFunction.required());
}
public @NotNull SectionValueBuilder<V> fromSection(@NotNull ConfigValueParser<ConfigurationWrapper<?>, V> valueParser,
@NotNull ConfigDataFunction<V, ? extends Map<String, Object>> valueSerializer) {
return new SectionValueBuilder<>(this.valueClass, valueParser, valueSerializer);
}
public @NotNull <S> SourceValueBuilder<S, V> from(Class<S> sourceClass) {
return from(
sourceClass, ConfigDataFunction.required(), ConfigValueParser.required(),
ConfigDataFunction.required(), ConfigDataFunction.required()
);
}
public @NotNull <S> SourceValueBuilder<S, V> from(@NotNull Class<S> sourceClass,
@NotNull ConfigDataFunction<Object, S> sourceParser,
@NotNull ConfigValueParser<S, V> valueParser,
@NotNull ConfigDataFunction<V, S> valueSerializer,
@NotNull ConfigDataFunction<S, Object> sourceSerializer) {
return new SourceValueBuilder<>(
sourceClass, sourceParser, this.valueClass, valueParser,
valueSerializer, sourceSerializer
);
}
public @NotNull SourceValueBuilder<Object, V> fromObject() {
return from(
Object.class, ConfigDataFunction.identity(),
ConfigValueParser.castObject(valueClass),
s -> {
if (s instanceof Enum<?>) return ((Enum<?>) s).name();
else return s;
}, ConfigDataFunction.toObject()
);
}
public @NotNull SourceValueBuilder<String, V> fromString() {
return from(
String.class, ConfigDataFunction.castToString(),
ConfigValueParser.parseString(this.valueClass),
ConfigDataFunction.castToString(), ConfigDataFunction.toObject()
);
}
}
@@ -1,52 +0,0 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueParser;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class SectionValueBuilder<V>
extends CommonConfigBuilder<V, SectionValueBuilder<V>> {
protected final @NotNull Class<V> valueClass;
protected @NotNull ConfigValueParser<ConfigurationWrapper<?>, V> parser;
protected @NotNull ConfigDataFunction<V, ? extends Map<String, Object>> serializer;
public SectionValueBuilder(@NotNull Class<V> valueClass,
@NotNull ConfigValueParser<ConfigurationWrapper<?>, V> parser,
@NotNull ConfigDataFunction<V, ? extends Map<String, Object>> serializer) {
this.valueClass = valueClass;
this.parser = parser;
this.serializer = serializer;
}
@Override
protected @NotNull SectionValueBuilder<V> getThis() {
return this;
}
public @NotNull SectionValueBuilder<V> parseValue(ConfigDataFunction<ConfigurationWrapper<?>, V> valueParser) {
return parseValue((section, path) -> valueParser.parse(section));
}
public @NotNull SectionValueBuilder<V> parseValue(ConfigValueParser<ConfigurationWrapper<?>, V> valueParser) {
this.parser = valueParser;
return this;
}
public @NotNull SectionValueBuilder<V> serializeValue(ConfigDataFunction<V, ? extends Map<String, Object>> serializer) {
this.serializer = serializer;
return this;
}
@Override
public @NotNull ConfiguredSection<V> build() {
return new ConfiguredSection<>(buildManifest(), this.valueClass, this.parser, this.serializer);
}
}
@@ -1,70 +0,0 @@
package cc.carm.lib.configuration.builder.value;
import cc.carm.lib.configuration.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.function.ConfigDataFunction;
import cc.carm.lib.configuration.function.ConfigValueParser;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import org.jetbrains.annotations.NotNull;
public class SourceValueBuilder<S, V> extends CommonConfigBuilder<V, SourceValueBuilder<S, V>> {
protected final @NotNull Class<S> sourceClass;
protected @NotNull ConfigDataFunction<Object, S> sourceParser;
protected final @NotNull Class<V> valueClass;
protected @NotNull ConfigValueParser<S, V> valueParser;
protected @NotNull ConfigDataFunction<S, Object> sourceSerializer;
protected @NotNull ConfigDataFunction<V, S> valueSerializer;
public SourceValueBuilder(@NotNull Class<S> sourceClass, @NotNull ConfigDataFunction<Object, S> sourceParser,
@NotNull Class<V> valueClass, @NotNull ConfigValueParser<S, V> valueParser,
@NotNull ConfigDataFunction<V, S> valueSerializer,
@NotNull ConfigDataFunction<S, Object> sourceSerializer) {
this.sourceClass = sourceClass;
this.sourceParser = sourceParser;
this.valueClass = valueClass;
this.valueParser = valueParser;
this.sourceSerializer = sourceSerializer;
this.valueSerializer = valueSerializer;
}
@Override
protected @NotNull SourceValueBuilder<S, V> getThis() {
return this;
}
public @NotNull SourceValueBuilder<S, V> parseSource(@NotNull ConfigDataFunction<Object, S> sourceParser) {
this.sourceParser = sourceParser;
return this;
}
public @NotNull SourceValueBuilder<S, V> parseValue(ConfigDataFunction<S, V> valueParser) {
return parseValue((section, path) -> valueParser.parse(section));
}
public @NotNull SourceValueBuilder<S, V> parseValue(@NotNull ConfigValueParser<S, V> valueParser) {
this.valueParser = valueParser;
return this;
}
public @NotNull SourceValueBuilder<S, V> serializeValue(@NotNull ConfigDataFunction<V, S> serializer) {
this.valueSerializer = serializer;
return this;
}
public @NotNull SourceValueBuilder<S, V> serializeSource(@NotNull ConfigDataFunction<S, Object> serializer) {
this.sourceSerializer = serializer;
return this;
}
@Override
public @NotNull ConfiguredValue<V> build() {
return new ConfiguredValue<>(
buildManifest(), this.valueClass,
this.valueParser.compose(this.sourceParser),
this.valueSerializer.andThen(sourceSerializer)
);
}
}