From aedc6cb4392122db3f874aa65ad13fe574ad55a9 Mon Sep 17 00:00:00 2001 From: carm Date: Sat, 15 Feb 2025 07:20:59 +0800 Subject: [PATCH] feat(map): Finished Map value builders. --- .../lib/configuration/adapter/ValueType.java | 1 + .../builder/AbstractConfigBuilder.java | 26 ++--- .../builder/impl/AbstractSectionBuilder.java | 12 ++- .../builder/impl/AbstractSourceBuilder.java | 2 +- .../builder/list/ConfigListBuilder.java | 16 +++- .../builder/list/SectionListBuilder.java | 6 +- .../builder/list/SourceListBuilder.java | 6 +- .../builder/map/ConfigMapBuilder.java | 80 ++++++++++++++++ .../builder/map/ConfigMapCreator.java | 48 ++++++++++ .../builder/map/SectionMapBuilder.java | 95 +++++++++++++++++++ .../builder/map/SourceMapBuilder.java | 91 ++++++++++++++++++ .../builder/value/ConfigValueBuilder.java | 7 +- .../configuration/function/ValueHandler.java | 13 ++- .../value/standard/ConfiguredMap.java | 23 ++++- .../demo/tests/ConfigurationTest.java | 4 +- .../demo/tests/conf/DemoConfiguration.java | 32 +++++-- .../demo/tests/model/ItemStack.java | 78 +++++++++++++++ 17 files changed, 492 insertions(+), 48 deletions(-) create mode 100644 core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapCreator.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/builder/map/SectionMapBuilder.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/builder/map/SourceMapBuilder.java create mode 100644 demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/ItemStack.java diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java index 3a889fa..23a36ab 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Map; import java.util.Objects; /** diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java index a44d2cb..4f87719 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java @@ -14,21 +14,21 @@ import java.util.function.Consumer; import java.util.function.Supplier; public abstract class AbstractConfigBuilder< - TYPE, RESULT extends ConfigValue, PROVIDER extends ConfigurationHolder, - SELF extends AbstractConfigBuilder + TYPE, RESULT extends ConfigValue, HOLDER extends ConfigurationHolder, + SELF extends AbstractConfigBuilder > { - protected final Class providerClass; + protected final Class providerClass; protected final ValueType type; - protected @Nullable PROVIDER provider; + protected @Nullable HOLDER holder; protected @Nullable String path; - protected @NotNull Supplier defaultValueSupplier = () -> null; - protected @NotNull BiConsumer, String> initializer = (provider, path) -> { + protected @NotNull Supplier<@Nullable TYPE> defaultValueSupplier = () -> null; + protected @NotNull BiConsumer, String> initializer = (h, p) -> { }; - protected AbstractConfigBuilder(Class providerClass, ValueType type) { + protected AbstractConfigBuilder(Class providerClass, ValueType type) { this.providerClass = providerClass; this.type = type; } @@ -41,8 +41,8 @@ public abstract class AbstractConfigBuilder< public abstract @NotNull RESULT build(); - public @NotNull SELF holder(@Nullable PROVIDER provider) { - this.provider = provider; + public @NotNull SELF holder(@Nullable HOLDER holder) { + this.holder = holder; return self(); } @@ -61,7 +61,7 @@ public abstract class AbstractConfigBuilder< } public @NotNull SELF append(@NotNull Consumer> initializer) { - return append((provider, path) -> initializer.accept(provider)); + return append((provider, valuePath) -> initializer.accept(provider)); } public @NotNull SELF defaults(@Nullable TYPE defaultValue) { @@ -74,17 +74,17 @@ public abstract class AbstractConfigBuilder< } public @NotNull SELF meta(@NotNull Consumer<@NotNull ConfigurationMetaHolder> metaConsumer) { - return append((provider, path) -> metaConsumer.accept(provider.metadata(path))); + return append((h, p) -> metaConsumer.accept(h.metadata(p))); } public @NotNull SELF meta(@NotNull ConfigurationMetadata type, @Nullable M value) { - return meta(holder -> holder.set(type, value)); + return meta(h -> h.set(type, value)); } protected @NotNull ValueManifest buildManifest() { return new ValueManifest<>( type(), this.defaultValueSupplier, this.initializer, - this.provider, this.path + this.holder, this.path ); } diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSectionBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSectionBuilder.java index 894a97f..c208bd0 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSectionBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSectionBuilder.java @@ -3,6 +3,7 @@ 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.DataConsumer; import cc.carm.lib.configuration.function.DataFunction; import cc.carm.lib.configuration.function.ValueHandler; import cc.carm.lib.configuration.source.section.ConfigureSection; @@ -11,7 +12,6 @@ import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; import java.util.Map; -import java.util.function.Consumer; public abstract class AbstractSectionBuilder< TYPE, PARAM, @@ -19,14 +19,15 @@ public abstract class AbstractSectionBuilder< SELF extends AbstractSectionBuilder > extends CommonConfigBuilder { + protected final @NotNull ValueType paramType; protected @NotNull ValueHandler parser; protected @NotNull ValueHandler> serializer; - public AbstractSectionBuilder(@NotNull ValueType type, @NotNull ValueType paramType, - @NotNull ValueHandler parser, - @NotNull ValueHandler> serializer) { + protected AbstractSectionBuilder(@NotNull ValueType type, @NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler> serializer) { super(type); this.paramType = paramType; this.parser = parser; @@ -51,7 +52,7 @@ public abstract class AbstractSectionBuilder< return self(); } - public @NotNull SELF serialize(Consumer> serializer) { + public @NotNull SELF serialize(DataConsumer> serializer) { return serialize((p, value) -> { Map map = new LinkedHashMap<>(); serializer.accept(map); @@ -71,4 +72,5 @@ public abstract class AbstractSectionBuilder< return map == null || map.isEmpty() ? null : map; }); } + } diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java index 1a4c7b6..54c2864 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java @@ -18,7 +18,7 @@ public abstract class AbstractSourceBuilder< protected @NotNull ValueHandler valueParser; protected @NotNull ValueHandler valueSerializer; - public AbstractSourceBuilder(@NotNull ValueType type, + protected AbstractSourceBuilder(@NotNull ValueType type, @NotNull ValueType sourceType, @NotNull ValueType paramType, @NotNull ValueHandler parser, @NotNull ValueHandler serializer) { diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java index c2099da..f4748ac 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java @@ -19,15 +19,25 @@ public class ConfigListBuilder { } public @NotNull SourceListBuilder from(@NotNull ValueType sourceType) { - return new SourceListBuilder<>(sourceType, type, ValueHandler.required(), ValueHandler.required(), ArrayList::new); + return new SourceListBuilder<>( + ArrayList::new, sourceType, type, + ValueHandler.required(type), + ValueHandler.required(sourceType) + ); } public @NotNull SourceListBuilder fromString() { - return new SourceListBuilder<>(ValueType.STRING, type, ValueHandler.required(), ValueHandler.stringValue(), ArrayList::new); + return new SourceListBuilder<>( + ArrayList::new, ValueType.STRING, type, + ValueHandler.required(type), ValueHandler.stringValue() + ); } public @NotNull SectionListBuilder fromSection() { - return new SectionListBuilder<>(type, ValueHandler.required(), ValueHandler.required(), ArrayList::new); + return new SectionListBuilder<>( + ArrayList::new, type, + ValueHandler.required(type), ValueHandler.required() + ); } diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java index 356a0b9..1cd381c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java @@ -14,10 +14,10 @@ public class SectionListBuilder extends AbstractSectionBuilder, V, Co protected @NotNull Supplier> constructor; - public SectionListBuilder(@NotNull ValueType paramType, + public SectionListBuilder(@NotNull Supplier> constructor, + @NotNull ValueType paramType, @NotNull ValueHandler parser, - @NotNull ValueHandler> serializer, - @NotNull Supplier> constructor) { + @NotNull ValueHandler> serializer) { super(new ValueType>() { }, paramType, parser, serializer); this.constructor = constructor; diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java index 655114c..f750823 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java @@ -17,9 +17,9 @@ public class SourceListBuilder protected @NotNull Supplier> constructor; - public SourceListBuilder(@NotNull ValueType sourceType, @NotNull ValueType paramType, - @NotNull ValueHandler parser, @NotNull ValueHandler serializer, - @NotNull Supplier> constructor) { + public SourceListBuilder(@NotNull Supplier> constructor, + @NotNull ValueType sourceType, @NotNull ValueType paramType, + @NotNull ValueHandler parser, @NotNull ValueHandler serializer) { super(new ValueType>() { }, sourceType, paramType, parser, serializer); this.constructor = constructor; diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java new file mode 100644 index 0000000..371e537 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java @@ -0,0 +1,80 @@ +package cc.carm.lib.configuration.builder.map; + +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.function.ValueHandler; +import cc.carm.lib.configuration.source.section.ConfigureSection; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.function.Supplier; + +public class ConfigMapBuilder, K, V> { + + + protected final @NotNull Supplier<@NotNull M> constructor; + protected final @NotNull ValueType keyType; + protected final @NotNull ValueType valueType; + + public ConfigMapBuilder(@NotNull Supplier<@NotNull M> constructor, + @NotNull ValueType keyType, @NotNull ValueType valueType) { + this.constructor = constructor; + this.keyType = keyType; + this.valueType = valueType; + } + + public > ConfigMapBuilder constructor(@NotNull Supplier supplier) { + return new ConfigMapBuilder<>(supplier, keyType, valueType); + } + + public @NotNull SourceMapBuilder from(@NotNull Class clazz) { + return from(ValueType.of(clazz)); + } + + public @NotNull SourceMapBuilder from(@NotNull ValueType sourceType) { + return from( + sourceType, + ValueHandler.required(keyType), ValueHandler.stringValue(), + ValueHandler.required(valueType), ValueHandler.required() + ); + } + + public @NotNull SourceMapBuilder from(@NotNull ValueType sourceType, + @NotNull ValueHandler keyParser, + @NotNull ValueHandler keySerializer, + @NotNull ValueHandler valueParser, + @NotNull ValueHandler valueSerializer) { + return new SourceMapBuilder<>( + this.constructor, sourceType, keyType, valueType, + keyParser, keySerializer, valueParser, valueSerializer + ); + } + + public @NotNull SourceMapBuilder fromString() { + return from( + ValueType.STRING, + ValueHandler.required(keyType), ValueHandler.stringValue(), + ValueHandler.required(valueType), ValueHandler.stringValue() + ); + } + + public @NotNull SectionMapBuilder fromSection() { + return fromSection( + ValueHandler.required(keyType), ValueHandler.stringValue(), + ValueHandler.required(valueType), ValueHandler.required() + ); + } + + public @NotNull SectionMapBuilder fromSection( + @NotNull ValueHandler keyParser, + @NotNull ValueHandler keySerializer, + @NotNull ValueHandler valueParser, + @NotNull ValueHandler> valueSerializer + ) { + return new SectionMapBuilder<>( + this.constructor, keyType, valueType, + keyParser, keySerializer, valueParser, valueSerializer + ); + } + + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapCreator.java b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapCreator.java new file mode 100644 index 0000000..403ef32 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapCreator.java @@ -0,0 +1,48 @@ +package cc.carm.lib.configuration.builder.map; + +import cc.carm.lib.configuration.adapter.ValueType; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.TreeMap; +import java.util.function.Supplier; + +public class ConfigMapCreator { + + protected final @NotNull ValueType keyType; + protected final @NotNull ValueType valueType; + + public ConfigMapCreator(@NotNull ValueType keyType, @NotNull ValueType valueType) { + this.keyType = keyType; + this.valueType = valueType; + } + + public > @NotNull ConfigMapBuilder constructor(@NotNull Supplier<@NotNull M> mapSuppler) { + return new ConfigMapBuilder<>(mapSuppler, keyType, valueType); + } + + public > @NotNull ConfigMapBuilder constructor(@NotNull Class type) { + return constructor(() -> { + try { + return type.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + + public @NotNull ConfigMapBuilder, K, V> asHashMap() { + return constructor(HashMap::new); + } + + public @NotNull ConfigMapBuilder, K, V> asLinkedMap() { + return constructor(LinkedHashMap::new); + } + + public @NotNull ConfigMapBuilder, K, V> asTreeMap() { + return constructor(TreeMap::new); + } + +} \ No newline at end of file diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/map/SectionMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/map/SectionMapBuilder.java new file mode 100644 index 0000000..3802c0a --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/map/SectionMapBuilder.java @@ -0,0 +1,95 @@ +package cc.carm.lib.configuration.builder.map; + +import cc.carm.lib.configuration.adapter.ValueAdapter; +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder; +import cc.carm.lib.configuration.function.DataFunction; +import cc.carm.lib.configuration.function.ValueHandler; +import cc.carm.lib.configuration.source.section.ConfigureSection; +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 SectionMapBuilder, K, V> + extends AbstractSectionBuilder< + Map, V, ConfiguredMap, + SectionMapBuilder + > { + + protected final @NotNull ValueType keyType; + + protected @NotNull Supplier constructor; + protected @NotNull ValueHandler keyParser; + protected @NotNull ValueHandler keySerializer; + + public SectionMapBuilder(@NotNull Supplier constructor, + @NotNull ValueType keyType, @NotNull ValueType valueType, + @NotNull ValueHandler keyParser, + @NotNull ValueHandler keySerializer, + @NotNull ValueHandler valueParser, + @NotNull ValueHandler> valueSerializer) { + super(new ValueType>() { + }, valueType, valueParser, valueSerializer); + this.keyType = keyType; + this.constructor = constructor; + this.keyParser = keyParser; + this.keySerializer = keySerializer; + } + + @Override + protected @NotNull SectionMapBuilder self() { + return this; + } + + + public @NotNull SectionMapBuilder parseKey(@NotNull DataFunction keyParser) { + return parseKey((holder, data) -> keyParser.handle(data)); + } + + public @NotNull SectionMapBuilder parseKey(@NotNull ValueHandler keyParser) { + this.keyParser = keyParser; + return this; + } + + public @NotNull SectionMapBuilder serializeKey(@NotNull DataFunction keySerializer) { + return serializeKey((holder, data) -> keySerializer.handle(data)); + } + + public @NotNull SectionMapBuilder serializeKey(@NotNull ValueHandler keySerializer) { + this.keySerializer = keySerializer; + return this; + } + + public @NotNull SectionMapBuilder defaults(@NotNull MAP defaults) { + return defaults(() -> defaults); + } + + public @NotNull SectionMapBuilder defaults(@NotNull Consumer defaults) { + return defaults(() -> { + MAP map = this.constructor.get(); + defaults.accept(map); + return map; + }); + } + + public @NotNull ValueAdapter buildKeyAdapter() { + return new ValueAdapter<>(this.keyType) + .parser((holder, type, data) -> { + String source = holder.deserialize(String.class, data); + return this.keyParser.handle(holder, source); + }) + .serializer((holder, type, data) -> { + String source = this.keySerializer.handle(holder, data); + return holder.serialize(source); + }); + } + + @Override + public @NotNull ConfiguredMap build() { + return new ConfiguredMap<>(buildManifest(), this.constructor, buildKeyAdapter(), this.buildAdapter()); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/map/SourceMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/map/SourceMapBuilder.java new file mode 100644 index 0000000..85520df --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/map/SourceMapBuilder.java @@ -0,0 +1,91 @@ +package cc.carm.lib.configuration.builder.map; + +import cc.carm.lib.configuration.adapter.ValueAdapter; +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.impl.AbstractSourceBuilder; +import cc.carm.lib.configuration.function.DataFunction; +import cc.carm.lib.configuration.function.ValueHandler; +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, SOURCE, K, V> + extends AbstractSourceBuilder< + Map, SOURCE, V, ConfiguredMap, + SourceMapBuilder + > { + + protected final @NotNull ValueType keyType; + + protected @NotNull Supplier constructor; + protected @NotNull ValueHandler keyParser; + protected @NotNull ValueHandler keySerializer; + + public SourceMapBuilder(@NotNull Supplier constructor, @NotNull ValueType sourceType, + @NotNull ValueType keyType, @NotNull ValueType valueType, + @NotNull ValueHandler keyParser, @NotNull ValueHandler keySerializer, + @NotNull ValueHandler valueParser, @NotNull ValueHandler valueSerializer) { + super(new ValueType>() { + }, sourceType, valueType, valueParser, valueSerializer); + this.keyType = keyType; + this.constructor = constructor; + this.keyParser = keyParser; + this.keySerializer = keySerializer; + } + + @Override + protected @NotNull SourceMapBuilder self() { + return this; + } + + public @NotNull SourceMapBuilder defaults(@NotNull MAP defaults) { + return defaults(() -> defaults); + } + + public @NotNull SourceMapBuilder defaults(@NotNull Consumer defaults) { + return defaults(() -> { + MAP map = this.constructor.get(); + defaults.accept(map); + return map; + }); + } + + public @NotNull SourceMapBuilder parseKey(@NotNull DataFunction keyParser) { + return parseKey((holder, data) -> keyParser.handle(data)); + } + + public @NotNull SourceMapBuilder parseKey(@NotNull ValueHandler keyParser) { + this.keyParser = keyParser; + return this; + } + + public @NotNull SourceMapBuilder serializeKey(@NotNull DataFunction keySerializer) { + return serializeKey((holder, data) -> keySerializer.handle(data)); + } + + public @NotNull SourceMapBuilder serializeKey(@NotNull ValueHandler keySerializer) { + this.keySerializer = keySerializer; + return this; + } + + public @NotNull ValueAdapter buildKeyAdapter() { + return new ValueAdapter<>(this.keyType) + .parser((holder, type, data) -> { + String source = holder.deserialize(String.class, data); + return this.keyParser.handle(holder, source); + }) + .serializer((holder, type, data) -> { + String source = this.keySerializer.handle(holder, data); + return holder.serialize(source); + }); + } + + @Override + public @NotNull ConfiguredMap build() { + return new ConfiguredMap<>(buildManifest(), this.constructor, buildKeyAdapter(), this.buildAdapter()); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/value/ConfigValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/value/ConfigValueBuilder.java index cad8557..cc32627 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/value/ConfigValueBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/value/ConfigValueBuilder.java @@ -1,6 +1,7 @@ package cc.carm.lib.configuration.builder.value; import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder; import cc.carm.lib.configuration.function.ValueHandler; import cc.carm.lib.configuration.source.section.ConfigureSection; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ public class ConfigValueBuilder { } public @NotNull SourceValueBuilder from(@NotNull ValueType sourceType) { - return from(sourceType, ValueHandler.required(), ValueHandler.required()); + return from(sourceType, ValueHandler.required(type), ValueHandler.required(sourceType)); } public @NotNull SourceValueBuilder from(@NotNull ValueType sourceType, @@ -30,11 +31,11 @@ public class ConfigValueBuilder { } public @NotNull SourceValueBuilder fromString() { - return from(ValueType.STRING, ValueHandler.required(), ValueHandler.stringValue()); + return from(ValueType.STRING, ValueHandler.required(type), ValueHandler.stringValue()); } public @NotNull SectionValueBuilder fromSection() { - return fromSection(ValueHandler.required(), ValueHandler.required()); + return fromSection(ValueHandler.required(type), ValueHandler.required()); } public @NotNull SectionValueBuilder fromSection( diff --git a/core/src/main/java/cc/carm/lib/configuration/function/ValueHandler.java b/core/src/main/java/cc/carm/lib/configuration/function/ValueHandler.java index 6b67b61..b7b9ff8 100644 --- a/core/src/main/java/cc/carm/lib/configuration/function/ValueHandler.java +++ b/core/src/main/java/cc/carm/lib/configuration/function/ValueHandler.java @@ -56,17 +56,24 @@ public interface ValueHandler { } @Contract(pure = true) - static @NotNull ValueHandler fromObject(ValueType type) { - return (provider, input) -> provider.deserialize(type, input); + static @NotNull ValueHandler deserialize(ValueType to) { + return (provider, input) -> provider.deserialize(to, input); } - @Contract(pure = true) static @NotNull ValueHandler required() { return (provider, input) -> { throw new IllegalArgumentException("Please specify the value parser."); }; } + + @Contract(pure = true) + static @NotNull ValueHandler required(ValueType type) { + return (provider, input) -> { + if (type.isInstance(input)) return type.cast(input); // Simple cast + throw new IllegalArgumentException("Please specify the value parser."); + }; + } } diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java index b6137de..6784eb5 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java @@ -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.map.ConfigMapCreator; import cc.carm.lib.configuration.source.section.ConfigureSection; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.impl.CachedConfigValue; @@ -18,14 +19,28 @@ import java.util.function.Supplier; public class ConfiguredMap extends CachedConfigValue> implements Map { + public static ConfigMapCreator builderOf(@NotNull ValueType keyType, @NotNull ValueType valueType) { + return new ConfigMapCreator<>(keyType, valueType); + } + + public static ConfigMapCreator builderOf(@NotNull Class keyType, @NotNull Class valueType) { + return new ConfigMapCreator<>(ValueType.of(keyType), ValueType.of(valueType)); + } + + public static ConfiguredMap of(@NotNull Supplier> constructor, + @NotNull ValueAdapter keyAdapter, @NotNull ValueAdapter valueAdapter) { + return new ConfiguredMap<>(new ValueManifest<>(new ValueType>() { + }, constructor::get), constructor, keyAdapter, valueAdapter); + } + protected final @NotNull Supplier> constructor; protected final @NotNull ValueAdapter keyAdapter; protected final @NotNull ValueAdapter valueAdapter; - protected ConfiguredMap(@NotNull ValueManifest> manifest, - @NotNull Supplier> constructor, - @NotNull ValueAdapter keyAdapter, @NotNull ValueAdapter valueAdapter) { + public ConfiguredMap(@NotNull ValueManifest> manifest, + @NotNull Supplier> constructor, + @NotNull ValueAdapter keyAdapter, @NotNull ValueAdapter valueAdapter) { super(manifest); this.constructor = constructor; this.keyAdapter = keyAdapter; @@ -88,7 +103,7 @@ public class ConfiguredMap extends CachedConfigValue> implements return get().get(key); } - public V getNotNull(Object key) { + public V getNotNull(@Nullable K key) { return Objects.requireNonNull(get(key)); } diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java index 6fad2f6..fed35a5 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java @@ -49,8 +49,8 @@ public class ConfigurationTest { System.out.println(" After size :" + DemoConfiguration.SUB.That.OPERATORS.size()); System.out.println("> Test Section:"); - System.out.println(DemoConfiguration.USERS.get()); - DemoConfiguration.USERS.add(UserRecord.random()); + System.out.println(DemoConfiguration.ALLOWLISTS.get()); + DemoConfiguration.ALLOWLISTS.add(UserRecord.random()); // System.out.println("> Test Maps:"); // DemoConfiguration.USERS.forEach((k, v) -> System.out.println(k + ": " + v)); diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java index 5190941..72f278b 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java @@ -6,18 +6,26 @@ import cc.carm.lib.configuration.annotation.FooterComments; import cc.carm.lib.configuration.annotation.HeaderComments; import cc.carm.lib.configuration.annotation.InlineComment; import cc.carm.lib.configuration.demo.DatabaseConfiguration; +import cc.carm.lib.configuration.demo.tests.model.ItemStack; import cc.carm.lib.configuration.demo.tests.model.UserRecord; import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredList; +import cc.carm.lib.configuration.value.standard.ConfiguredMap; import cc.carm.lib.configuration.value.standard.ConfiguredValue; import java.time.temporal.ChronoUnit; +import java.util.Arrays; import java.util.Objects; import java.util.UUID; @ConfigPath(root = true) @HeaderComments({"此处内容将显示在配置文件的最上方"}) -@FooterComments({"此处内容将显示在配置文件的最下方", "可用于显示版权信息等"}) +@FooterComments({ + "------------------------------------------------", + "此处内容将显示在配置文件的最下方", + "可用于显示版权信息等", + "感谢您使用 https://github.com/CarmJos/EasyConfiguration !" +}) public interface DemoConfiguration extends Configuration { @ConfigPath(root = true) @@ -40,16 +48,24 @@ public interface DemoConfiguration extends Configuration { @InlineComment("默认地注释会加到Section的首行末尾") // 通过注解给配置添加注释。 @InlineComment(value = "用户名(匹配注释)", regex = "name") // 通过注解给配置添加注释。 @InlineComment(value = "信息", regex = "info.*") // 通过注解给配置添加注释。 - ConfiguredList USERS = ConfiguredList.builderOf(UserRecord.class).fromSection() + ConfiguredList ALLOWLISTS = ConfiguredList.builderOf(UserRecord.class).fromSection() .parse(UserRecord::deserialize).serialize(UserRecord::serialize) .defaults(UserRecord.CARM).build(); -// @HeaderComment({"[ID - UUID]对照表", "", "用于测试Map类型的解析与序列化保存"}) -// ConfiguredMap USERS = ConfiguredMap.builderOf(Integer.class, UUID.class) -// .asLinkedMap().fromString() -// .parseKey(Integer::parseInt) -// .parseValue(v -> Objects.requireNonNull(UUID.fromString(v))) -// .build(); + @HeaderComments({ + "------------------------------------------------", + "[ID - ItemStack]对照表", "", "用于测试Map类型的解析与序列化保存" + }) + @FooterComments("------------------------------------------------") + ConfiguredMap ITEMS = ConfiguredMap.builderOf(Integer.class, ItemStack.class) + .asLinkedMap().fromSection() + .parseKey(data -> Integer.parseInt(data)) + .parse(ItemStack::deserialize).serialize(ItemStack::serialize) + .defaults(m -> { + m.put(1, new ItemStack("stone", 64)); + m.put(2, new ItemStack("iron", 64, "铁锭", Arrays.asList("一些铁锭", "可以制造东西"))); + }) + .build(); /** diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/ItemStack.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/ItemStack.java new file mode 100644 index 0000000..1b24946 --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/ItemStack.java @@ -0,0 +1,78 @@ +package cc.carm.lib.configuration.demo.tests.model; + +import cc.carm.lib.configuration.source.section.ConfigureSection; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class ItemStack { + + protected String material; + protected int amount; + protected @Nullable String name; + protected @Nullable List lore; + + public ItemStack(String material, int amount) { + this(material, amount, null, null); + } + + public ItemStack(String material, int amount, @Nullable String name, @Nullable List lore) { + this.material = material; + this.amount = amount; + this.name = name; + this.lore = lore; + } + + public String getMaterial() { + return material; + } + + public int getAmount() { + return amount; + } + + public String getName() { + return name; + } + + public List getLore() { + return lore; + } + + public void setMaterial(String material) { + this.material = material; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public void setName(String name) { + this.name = name; + } + + public void setLore(List lore) { + this.lore = lore; + } + + + public Map serialize() { + Map map = new LinkedHashMap<>(); + map.put("material", material); + if (amount != 1) map.put("amount", amount); + if (name != null) map.put("name", name); + if (lore != null) map.put("lore", lore); + return map; + } + + public static ItemStack deserialize(ConfigureSection section) { + return new ItemStack( + section.getString("material"), + section.getInt("amount", 1), + section.getString("name"), + section.getStringList("lore") + ); + } +}