diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 66a0407..1a776b6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,8 +31,8 @@ jobs: key: ${{ runner.os }}-project-local-gradle-caches-${{ hashFiles('**/libs.versions.toml', '**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-project-local-gradle-caches- - - name: "setup concurrentutil" - run: ./installConcurrentUtil.sh + - name: "setup dependencies" + run: ./install_deps.sh - name: "execute gradle build" run: ./gradlew build - name: Determine Snapshot Status diff --git a/.gitmodules b/.gitmodules index 32ac5cd..29aa2c0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "ConcurrentUtil"] path = ConcurrentUtil url = https://github.com/Spottedleaf/ConcurrentUtil.git +[submodule "YamlConfig"] + path = YamlConfig + url = git@github.com:Spottedleaf/YamlConfig.git diff --git a/YamlConfig b/YamlConfig new file mode 160000 index 0000000..9230f1a --- /dev/null +++ b/YamlConfig @@ -0,0 +1 @@ +Subproject commit 9230f1af4950114cd6e1c19b48066336a97c7177 diff --git a/build.gradle b/build.gradle index 5561a5d..723b492 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" api("ca.spottedleaf:concurrentutil:${rootProject.concurrentutil_version}") + api("ca.spottedleaf:yamlconfig:${rootProject.yamlconfig_version}") api("org.yaml:snakeyaml:${rootProject.snakeyaml_version}") modImplementation "me.shedaniel.cloth:cloth-config:${rootProject.cloth_version}" @@ -48,6 +49,7 @@ allprojects { mavenLocal { mavenContent { includeModule("ca.spottedleaf", "concurrentutil") + includeModule("ca.spottedleaf", "yamlconfig") } } maven { diff --git a/fabric/build.gradle b/fabric/build.gradle index 36b196f..0d2f6b9 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -18,6 +18,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" libs("ca.spottedleaf:concurrentutil:${rootProject.concurrentutil_version}") + libs("ca.spottedleaf:yamlconfig:${rootProject.yamlconfig_version}") libs("org.yaml:snakeyaml:${rootProject.snakeyaml_version}") modImplementation "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_version}" @@ -43,6 +44,7 @@ shadowJar { destinationDirectory = layout.buildDirectory.dir("libs") configurations = [project.configurations.shadow] relocate 'ca.spottedleaf.concurrentutil', 'ca.spottedleaf.moonrise.libs.ca.spottedleaf.concurrentutil' + relocate 'ca.spottedleaf.yamlconfig', 'ca.spottedleaf.moonrise.libs.ca.spottedleaf.yamlconfig' relocate 'org.yaml.snakeyaml', 'ca.spottedleaf.moonrise.libs.org.yaml.snakeyaml' } diff --git a/gradle.properties b/gradle.properties index fe71e05..6cc7d21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,8 +8,9 @@ loader_version=0.16.7 supported_minecraft_versions=1.21.3 neoforge_version=21.3.31-beta fabric_api_version=0.107.0+1.21.3 -snakeyaml_version=2.2 +snakeyaml_version=2.3 concurrentutil_version=0.0.2-SNAPSHOT +yamlconfig_version=1.0.1-SNAPSHOT cloth_version=16.0.141 modmenu_version=12.0.0-beta.1 # version ids from modrinth diff --git a/installConcurrentUtil.sh b/install_deps.sh old mode 100755 new mode 100644 similarity index 74% rename from installConcurrentUtil.sh rename to install_deps.sh index 6f59f53..1a8459e --- a/installConcurrentUtil.sh +++ b/install_deps.sh @@ -2,5 +2,11 @@ set -eou pipefail git submodule update --init --recursive + cd ConcurrentUtil mvn install + +cd .. + +cd YamlConfig +mvn install diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 045db59..14027e1 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -22,6 +22,7 @@ dependencies { neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" shadow("ca.spottedleaf:concurrentutil:${rootProject.concurrentutil_version}") + shadow("ca.spottedleaf:yamlconfig:${rootProject.yamlconfig_version}") shadow("org.yaml:snakeyaml:${rootProject.snakeyaml_version}") forgeExtra("org.yaml:snakeyaml:${rootProject.snakeyaml_version}") @@ -42,6 +43,7 @@ shadowJar { destinationDirectory = layout.buildDirectory.dir("libs") configurations = [project.configurations.shadow] relocate 'ca.spottedleaf.concurrentutil', 'ca.spottedleaf.moonrise.libs.ca.spottedleaf.concurrentutil' + relocate 'ca.spottedleaf.yamlconfig', 'ca.spottedleaf.moonrise.libs.ca.spottedleaf.yamlconfig' relocate 'org.yaml.snakeyaml', 'ca.spottedleaf.moonrise.libs.org.yaml.snakeyaml' } diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/InitialiseHook.java b/src/main/java/ca/spottedleaf/moonrise/common/config/InitialiseHook.java deleted file mode 100644 index c243290..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/InitialiseHook.java +++ /dev/null @@ -1,7 +0,0 @@ -package ca.spottedleaf.moonrise.common.config; - -public interface InitialiseHook { - - public void initialise(); - -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapter.java deleted file mode 100644 index 5610079..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapter.java +++ /dev/null @@ -1,11 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter; - -import java.lang.reflect.Type; - -public abstract class TypeAdapter { - - public abstract T deserialize(final TypeAdapterRegistry registry, final Object input, final Type type); - - public abstract S serialize(final TypeAdapterRegistry registry, final T value, final Type type); - -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapterRegistry.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapterRegistry.java deleted file mode 100644 index a9f933f..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/TypeAdapterRegistry.java +++ /dev/null @@ -1,307 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter; - -import ca.spottedleaf.moonrise.common.config.InitialiseHook; -import ca.spottedleaf.moonrise.common.config.adapter.collection.CollectionTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.collection.ListTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.collection.SortedMapTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.BooleanTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.ByteTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.DoubleTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.FloatTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.IntegerTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.LongTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.ShortTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.StringTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.type.BigDecimalTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.type.BigIntegerTypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.type.DurationTypeAdapter; -import ca.spottedleaf.moonrise.common.config.annotation.Adaptable; -import ca.spottedleaf.moonrise.common.config.annotation.Serializable; -import ca.spottedleaf.moonrise.common.config.type.Duration; -import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public final class TypeAdapterRegistry { - - private final Map, TypeAdapter> adapters = new HashMap<>(); - { - this.adapters.put(boolean.class, BooleanTypeAdapter.INSTANCE); - this.adapters.put(byte.class, ByteTypeAdapter.INSTANCE); - this.adapters.put(short.class, ShortTypeAdapter.INSTANCE); - this.adapters.put(int.class, IntegerTypeAdapter.INSTANCE); - this.adapters.put(long.class, LongTypeAdapter.INSTANCE); - this.adapters.put(float.class, FloatTypeAdapter.INSTANCE); - this.adapters.put(double.class, DoubleTypeAdapter.INSTANCE); - - this.adapters.put(Boolean.class, BooleanTypeAdapter.INSTANCE); - this.adapters.put(Byte.class, ByteTypeAdapter.INSTANCE); - this.adapters.put(Short.class, ShortTypeAdapter.INSTANCE); - this.adapters.put(Integer.class, IntegerTypeAdapter.INSTANCE); - this.adapters.put(Long.class, LongTypeAdapter.INSTANCE); - this.adapters.put(Float.class, FloatTypeAdapter.INSTANCE); - this.adapters.put(Double.class, DoubleTypeAdapter.INSTANCE); - - this.adapters.put(String.class, StringTypeAdapter.INSTANCE); - - this.adapters.put(Collection.class, CollectionTypeAdapter.INSTANCE); - this.adapters.put(List.class, ListTypeAdapter.INSTANCE); - this.adapters.put(Map.class, SortedMapTypeAdapter.SORTED_CASE_INSENSITIVE); - this.adapters.put(LinkedHashMap.class, SortedMapTypeAdapter.SORTED_CASE_INSENSITIVE); - - this.adapters.put(BigInteger.class, BigIntegerTypeAdapter.INSTANCE); - this.adapters.put(BigDecimal.class, BigDecimalTypeAdapter.INSTANCE); - this.adapters.put(Duration.class, DurationTypeAdapter.INSTANCE); - } - - public TypeAdapter putAdapter(final Class clazz, final TypeAdapter adapter) { - return this.adapters.put(clazz, adapter); - } - - public TypeAdapter getAdapter(final Class clazz) { - return this.adapters.get(clazz); - } - - public Object deserialize(final Object input, final Type type) { - TypeAdapter adapter = null; - if (type instanceof Class clazz) { - adapter = this.adapters.get(clazz); - } - if (adapter == null && (type instanceof ParameterizedType parameterizedType)) { - adapter = this.adapters.get((Class)parameterizedType.getRawType()); - } - - if (adapter == null) { - throw new IllegalArgumentException("No adapter for " + input.getClass() + " with type " + type); - } - - return ((TypeAdapter)adapter).deserialize(this, input, type); - } - - public Object serialize(final Object input, final Type type) { - TypeAdapter adapter = null; - if (type instanceof Class clazz) { - adapter = this.adapters.get(clazz); - } - if (adapter == null && (type instanceof ParameterizedType parameterizedType)) { - adapter = this.adapters.get((Class)parameterizedType.getRawType()); - } - if (adapter == null) { - adapter = this.adapters.get(input.getClass()); - } - - if (adapter == null) { - throw new IllegalArgumentException("No adapter for " + input.getClass() + " with type " + type); - } - - return ((TypeAdapter)adapter).serialize(this, input, type); - } - - public TypeAdapter> makeAdapter(final Class clazz) throws Exception { - final TypeAdapter> ret = new AutoTypeAdapter<>(this, clazz); - - this.putAdapter(clazz, ret); - - return ret; - } - - public void callInitialisers(final T object) { - if (object == null) { - return; - } - - final TypeAdapter adapter = this.getAdapter(object.getClass()); - - if (!(adapter instanceof AutoTypeAdapter autoTypeAdapter)) { - return; - } - - ((AutoTypeAdapter)autoTypeAdapter).callInitialisers(object); - } - - private static final class AutoTypeAdapter extends TypeAdapter> { - - private final TypeAdapterRegistry registry; - private final Constructor constructor; - private final SerializableField[] fields; - - public AutoTypeAdapter(final TypeAdapterRegistry registry, final Class clazz) throws Exception { - this.registry = registry; - this.constructor = clazz.getConstructor(); - this.fields = findSerializableFields(registry, clazz); - } - - private static TypeAdapter findOrMakeAdapter(final TypeAdapterRegistry registry, final Class clazz) throws Exception { - final TypeAdapter ret = registry.getAdapter(clazz); - if (ret != null) { - return ret; - } - - for (final Annotation annotation : clazz.getAnnotations()) { - if (annotation instanceof Adaptable adaptable) { - return registry.makeAdapter(clazz); - } - } - - throw new IllegalArgumentException("No type adapter for " + clazz + " (Forgot @Adaptable?)"); - } - - private static String makeSerializedKey(final String input) { - final StringBuilder ret = new StringBuilder(); - - for (final char c : input.toCharArray()) { - if (!Character.isUpperCase(c)) { - ret.append(c); - continue; - } - ret.append('-'); - ret.append(Character.toLowerCase(c)); - } - - return ret.toString(); - } - - private static record SerializableField( - Field field, - boolean required, - String comment, - TypeAdapter adapter, - boolean serialize, - String serializedKey - ) {} - - private static SerializableField[] findSerializableFields(final TypeAdapterRegistry registry, Class clazz) throws Exception { - final List ret = new ArrayList<>(); - do { - for (final Field field : clazz.getDeclaredFields()) { - field.setAccessible(true); - - for (final Annotation annotation : field.getAnnotations()) { - if (!(annotation instanceof Serializable serializable)) { - continue; - } - - final TypeAdapter adapter; - - if (serializable.adapter() != TypeAdapter.class) { - adapter = serializable.adapter().getConstructor().newInstance(); - } else { - adapter = findOrMakeAdapter(registry, field.getType()); - } - - String serializedKey = serializable.serializedKey(); - if (serializedKey.isEmpty()) { - serializedKey = makeSerializedKey(field.getName()); - } - - ret.add(new SerializableField( - field, serializable.required(), serializable.comment(), adapter, - serializable.serialize(), serializedKey - )); - } - } - } while ((clazz = clazz.getSuperclass()) != Object.class); - - ret.sort((final SerializableField c1, final SerializableField c2) -> { - return c1.serializedKey.compareTo(c2.serializedKey); - }); - - return ret.toArray(new SerializableField[0]); - } - - @Override - public T deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(input instanceof Map inputMap)) { - throw new IllegalArgumentException("Not a map type: " + input.getClass()); - } - - try { - final T ret = this.constructor.newInstance(); - - for (final SerializableField field : this.fields) { - final Object fieldValue = inputMap.get(field.serializedKey); - - if (fieldValue == null) { - if (field.required) { - throw new IllegalArgumentException("Missing required field '" + field.serializedKey + "' in " + this.constructor.getDeclaringClass()); - } - continue; - } - - field.field.set(ret, field.adapter.deserialize(registry, fieldValue, field.field.getGenericType())); - } - - return ret; - } catch (final Exception ex) { - throw new RuntimeException(ex); - } - } - - @Override - public Map serialize(final TypeAdapterRegistry registry, final T value, final Type type) { - final LinkedHashMap ret = new LinkedHashMap<>(); - - for (final SerializableField field : this.fields) { - if (!field.serialize) { - continue; - } - - final Object fieldValue; - try { - fieldValue = field.field.get(value); - } catch (final Exception ex) { - throw new RuntimeException(ex); - } - - if (fieldValue != null) { - ret.put( - field.comment.isBlank() ? field.serializedKey : new CommentedData(field.comment, field.serializedKey), - ((TypeAdapter)field.adapter).serialize( - registry, fieldValue, field.field.getGenericType() - ) - ); - } - } - - return ret; - } - - public void callInitialisers(final T value) { - for (final SerializableField field : this.fields) { - final Object fieldValue; - try { - fieldValue = field.field.get(value); - } catch (final Exception ex) { - throw new RuntimeException(ex); - } - - if (fieldValue instanceof InitialiseHook initialiseHook) { - initialiseHook.initialise(); - } - - this.registry.callInitialisers(fieldValue); - } - } - } - - public static final class CommentedData { - - public final String comment; - public final Object data; - - public CommentedData(final String comment, final Object data) { - this.comment = comment; - this.data = data; - } - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/CollectionTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/CollectionTypeAdapter.java deleted file mode 100644 index 832fc45..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/CollectionTypeAdapter.java +++ /dev/null @@ -1,46 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.collection; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import ca.spottedleaf.moonrise.common.config.adapter.primitive.StringTypeAdapter; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public final class CollectionTypeAdapter extends TypeAdapter, List> { - - public static final CollectionTypeAdapter INSTANCE = new CollectionTypeAdapter(); - - @Override - public Collection deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(type instanceof ParameterizedType parameterizedType)) { - throw new IllegalArgumentException("Collection field must specify generic type"); - } - final Type elementType = parameterizedType.getActualTypeArguments()[0]; - if (input instanceof Collection collection) { - final List ret = new ArrayList<>(collection.size()); - - for (final Object v : collection) { - ret.add(registry.deserialize(v, elementType)); - } - - return ret; - } - throw new IllegalArgumentException("Not a collection type: " + input.getClass()); - } - - @Override - public List serialize(final TypeAdapterRegistry registry, final Collection value, final Type type) { - final List ret = new ArrayList<>(value.size()); - - final Type elementType = type instanceof ParameterizedType parameterizedType ? parameterizedType.getActualTypeArguments()[0] : null; - - for (final Object v : value) { - ret.add(registry.serialize(v, elementType == null ? v.getClass() : elementType)); - } - - return ret; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/ListTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/ListTypeAdapter.java deleted file mode 100644 index 9dea622..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/ListTypeAdapter.java +++ /dev/null @@ -1,45 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.collection; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public final class ListTypeAdapter extends TypeAdapter, List> { - - public static final ListTypeAdapter INSTANCE = new ListTypeAdapter(); - - @Override - public List deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(type instanceof ParameterizedType parameterizedType)) { - throw new IllegalArgumentException("Collection field must specify generic type"); - } - final Type elementType = parameterizedType.getActualTypeArguments()[0]; - if (input instanceof Collection collection) { - final List ret = new ArrayList<>(collection.size()); - - for (final Object v : collection) { - ret.add(registry.deserialize(v, elementType)); - } - - return ret; - } - throw new IllegalArgumentException("Not a collection type: " + input.getClass()); - } - - @Override - public List serialize(final TypeAdapterRegistry registry, final List value, final Type type) { - final List ret = new ArrayList<>(value.size()); - - final Type elementType = type instanceof ParameterizedType parameterizedType ? parameterizedType.getActualTypeArguments()[0] : null; - - for (final Object v : value) { - ret.add(registry.serialize(v, elementType)); - } - - return ret; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/SortedMapTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/SortedMapTypeAdapter.java deleted file mode 100644 index 0576640..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/SortedMapTypeAdapter.java +++ /dev/null @@ -1,59 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.collection; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.TreeMap; - -public final class SortedMapTypeAdapter extends TypeAdapter, Map> { - - public static final SortedMapTypeAdapter SORTED_CASE_INSENSITIVE = new SortedMapTypeAdapter(String.CASE_INSENSITIVE_ORDER); - public static final SortedMapTypeAdapter SORTED_CASE_SENSITIVE = new SortedMapTypeAdapter(null); - - private final Comparator keyComparator; - - public SortedMapTypeAdapter(final Comparator keyComparator) { - this.keyComparator = keyComparator; - } - - @Override - public Map deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(type instanceof ParameterizedType parameterizedType)) { - throw new IllegalArgumentException("Collection field must specify generic type"); - } - final Type valueType = parameterizedType.getActualTypeArguments()[1]; - if (input instanceof Map inputMap) { - final Map castedInput = (Map)inputMap; - - final TreeMap ret = new TreeMap<>(this.keyComparator); - - for (final Map.Entry entry : castedInput.entrySet()) { - ret.put(entry.getKey(), registry.deserialize(entry.getValue(), valueType)); - } - - // transform to linked so that get() is O(1) - return new LinkedHashMap<>(ret); - } - - throw new IllegalArgumentException("Not a map type: " + input.getClass()); - } - - @Override - public Map serialize(final TypeAdapterRegistry registry, final Map value, final Type type) { - final TreeMap ret = new TreeMap<>(this.keyComparator); - - final Type valueType = type instanceof ParameterizedType parameterizedType ? parameterizedType.getActualTypeArguments()[1] : null; - - for (final Map.Entry entry : value.entrySet()) { - ret.put(entry.getKey(), registry.serialize(entry.getValue(), valueType)); - } - - // transform to linked so that get() is O(1) - return new LinkedHashMap<>(ret); - } - -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/UnsortedMapTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/UnsortedMapTypeAdapter.java deleted file mode 100644 index dd172ca..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/collection/UnsortedMapTypeAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.collection; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.LinkedHashMap; -import java.util.Map; - -public final class UnsortedMapTypeAdapter extends TypeAdapter, Map> { - - public static final UnsortedMapTypeAdapter INSTANCE = new UnsortedMapTypeAdapter(); - - @Override - public Map deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(type instanceof ParameterizedType parameterizedType)) { - throw new IllegalArgumentException("Collection field must specify generic type"); - } - final Type valueType = parameterizedType.getActualTypeArguments()[1]; - if (input instanceof Map inputMap) { - final Map castedInput = (Map)inputMap; - - final LinkedHashMap ret = new LinkedHashMap<>(); - - for (final Map.Entry entry : castedInput.entrySet()) { - ret.put(entry.getKey(), registry.deserialize(entry.getValue(), valueType)); - } - - return ret; - } - - throw new IllegalArgumentException("Not a map type: " + input.getClass()); - } - - @Override - public Map serialize(final TypeAdapterRegistry registry, final Map value, final Type type) { - final LinkedHashMap ret = new LinkedHashMap<>(); - - final Type valueType = type instanceof ParameterizedType parameterizedType ? parameterizedType.getActualTypeArguments()[1] : null; - - for (final Map.Entry entry : value.entrySet()) { - ret.put(entry.getKey(), registry.serialize(entry.getValue(), valueType)); - } - - return ret; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/BooleanTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/BooleanTypeAdapter.java deleted file mode 100644 index 2b1cb8f..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/BooleanTypeAdapter.java +++ /dev/null @@ -1,33 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; - -public final class BooleanTypeAdapter extends TypeAdapter { - - public static final BooleanTypeAdapter INSTANCE = new BooleanTypeAdapter(); - - @Override - public Boolean deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Boolean ret) { - return ret; - } - if (input instanceof String str) { - if (str.equalsIgnoreCase("false")) { - return Boolean.FALSE; - } - if (str.equalsIgnoreCase("true")) { - return Boolean.TRUE; - } - throw new IllegalArgumentException("Not a boolean: " + str); - } - - throw new IllegalArgumentException("Not a boolean type: " + input.getClass()); - } - - @Override - public Boolean serialize(final TypeAdapterRegistry registry, final Boolean value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ByteTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ByteTypeAdapter.java deleted file mode 100644 index 1f39569..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ByteTypeAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigInteger; - -public final class ByteTypeAdapter extends TypeAdapter { - - public static final ByteTypeAdapter INSTANCE = new ByteTypeAdapter(); - - private static Byte cast(final Object original, final long value) { - if (value < (long)Byte.MIN_VALUE || value > (long)Byte.MAX_VALUE) { - throw new IllegalArgumentException("Byte value is out of range: " + original.toString()); - } - return Byte.valueOf((byte)value); - } - - @Override - public Byte deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - // note: silently discard floating point significand - return cast(input, number instanceof BigInteger bigInteger ? bigInteger.longValueExact() : number.longValue()); - } - if (input instanceof String string) { - return cast(input, (long)Double.parseDouble(string)); - } - - throw new IllegalArgumentException("Not a byte type: " + input.getClass()); - } - - @Override - public Byte serialize(final TypeAdapterRegistry registry, final Byte value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/DoubleTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/DoubleTypeAdapter.java deleted file mode 100644 index 00b5db6..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/DoubleTypeAdapter.java +++ /dev/null @@ -1,27 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; - -public final class DoubleTypeAdapter extends TypeAdapter { - - public static final DoubleTypeAdapter INSTANCE = new DoubleTypeAdapter(); - - @Override - public Double deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - return Double.valueOf(number.doubleValue()); - } - if (input instanceof String string) { - return Double.valueOf(Double.parseDouble(string)); - } - - throw new IllegalArgumentException("Not a byte type: " + input.getClass()); - } - - @Override - public Double serialize(final TypeAdapterRegistry registry, final Double value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/FloatTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/FloatTypeAdapter.java deleted file mode 100644 index 80e4f3c..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/FloatTypeAdapter.java +++ /dev/null @@ -1,35 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; - -public final class FloatTypeAdapter extends TypeAdapter { - - public static final FloatTypeAdapter INSTANCE = new FloatTypeAdapter(); - - private static Float cast(final Object original, final double value) { - if (value < -(double)Float.MAX_VALUE || value > (double)Float.MAX_VALUE) { - throw new IllegalArgumentException("Byte value is out of range: " + original.toString()); - } - // note: silently ignore precision loss - return Float.valueOf((float)value); - } - - @Override - public Float deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - return cast(input, number.doubleValue()); - } - if (input instanceof String string) { - return cast(input, Double.parseDouble(string)); - } - - throw new IllegalArgumentException("Not a byte type: " + input.getClass()); - } - - @Override - public Float serialize(final TypeAdapterRegistry registry, final Float value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/IntegerTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/IntegerTypeAdapter.java deleted file mode 100644 index 7e3ffc2..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/IntegerTypeAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigInteger; - -public final class IntegerTypeAdapter extends TypeAdapter { - - public static final IntegerTypeAdapter INSTANCE = new IntegerTypeAdapter(); - - private static Integer cast(final Object original, final long value) { - if (value < (long)Integer.MIN_VALUE || value > (long)Integer.MAX_VALUE) { - throw new IllegalArgumentException("Integer value is out of range: " + original.toString()); - } - return Integer.valueOf((int)value); - } - - @Override - public Integer deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - // note: silently discard floating point significand - return cast(input, number instanceof BigInteger bigInteger ? bigInteger.longValueExact() : number.longValue()); - } - if (input instanceof String string) { - return cast(input, (long)Double.parseDouble(string)); - } - - throw new IllegalArgumentException("Not an integer type: " + input.getClass()); - } - - @Override - public Integer serialize(final TypeAdapterRegistry registry, final Integer value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/LongTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/LongTypeAdapter.java deleted file mode 100644 index 78e3d5a..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/LongTypeAdapter.java +++ /dev/null @@ -1,33 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigInteger; - -public final class LongTypeAdapter extends TypeAdapter { - - public static final LongTypeAdapter INSTANCE = new LongTypeAdapter(); - - @Override - public Long deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - // note: silently discard floating point significand - return number instanceof BigInteger bigInteger ? bigInteger.longValueExact() : number.longValue(); - } - if (input instanceof String string) { - try { - return Long.valueOf(Long.parseLong(string)); - } catch (final NumberFormatException ex) { - return Long.valueOf((long)Double.parseDouble(string)); - } - } - - throw new IllegalArgumentException("Not a long type: " + input.getClass()); - } - - @Override - public Long serialize(final TypeAdapterRegistry registry, final Long value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ShortTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ShortTypeAdapter.java deleted file mode 100644 index 43c3c12..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/ShortTypeAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigInteger; - -public final class ShortTypeAdapter extends TypeAdapter { - - public static final ShortTypeAdapter INSTANCE = new ShortTypeAdapter(); - - private static Short cast(final Object original, final long value) { - if (value < (long)Short.MIN_VALUE || value > (long)Short.MAX_VALUE) { - throw new IllegalArgumentException("Short value is out of range: " + original.toString()); - } - return Short.valueOf((short)value); - } - - @Override - public Short deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - // note: silently discard floating point significand - return cast(input, number instanceof BigInteger bigInteger ? bigInteger.longValueExact() : number.longValue()); - } - if (input instanceof String string) { - return cast(input, (long)Double.parseDouble(string)); - } - - throw new IllegalArgumentException("Not a short type: " + input.getClass()); - } - - @Override - public Short serialize(final TypeAdapterRegistry registry, final Short value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/StringTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/StringTypeAdapter.java deleted file mode 100644 index 32979f4..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/primitive/StringTypeAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.primitive; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; - -public final class StringTypeAdapter extends TypeAdapter { - - public static final StringTypeAdapter INSTANCE = new StringTypeAdapter(); - - @Override - public String deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Boolean bool) { - return String.valueOf(bool.booleanValue()); - } - if (input instanceof Number number) { - return number.toString(); - } - if (input instanceof String string) { - return string; - } - throw new IllegalArgumentException("Not a string type: " + input.getClass()); - } - - @Override - public String serialize(final TypeAdapterRegistry registry, final String value, final Type type) { - return value; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigDecimalTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigDecimalTypeAdapter.java deleted file mode 100644 index df9e650..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigDecimalTypeAdapter.java +++ /dev/null @@ -1,30 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.type; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; - -public final class BigDecimalTypeAdapter extends TypeAdapter { - - public static final BigDecimalTypeAdapter INSTANCE = new BigDecimalTypeAdapter(); - - @Override - public BigDecimal deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - // safest to catch all number impls is to use toString - return new BigDecimal(number.toString()); - } - if (input instanceof String string) { - return new BigDecimal(string); - } - - throw new IllegalArgumentException("Not an BigDecimal type: " + input.getClass()); - } - - @Override - public String serialize(final TypeAdapterRegistry registry, final BigDecimal value, final Type type) { - return value.toString(); - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigIntegerTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigIntegerTypeAdapter.java deleted file mode 100644 index 9dbfc71..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/BigIntegerTypeAdapter.java +++ /dev/null @@ -1,37 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.type; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; - -public final class BigIntegerTypeAdapter extends TypeAdapter { - - public static final BigIntegerTypeAdapter INSTANCE = new BigIntegerTypeAdapter(); - - @Override - public BigInteger deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof Number number) { - if (number instanceof BigInteger bigInteger) { - return bigInteger; - } - // note: silently discard floating point significand - if (number instanceof BigDecimal bigDecimal) { - return bigDecimal.toBigInteger(); - } - - return BigInteger.valueOf(number.longValue()); - } - if (input instanceof String string) { - return new BigDecimal(string).toBigInteger(); - } - - throw new IllegalArgumentException("Not an BigInteger type: " + input.getClass()); - } - - @Override - public String serialize(final TypeAdapterRegistry registry, final BigInteger value, final Type type) { - return value.toString(); - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/DurationTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/DurationTypeAdapter.java deleted file mode 100644 index 6effd1a..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/adapter/type/DurationTypeAdapter.java +++ /dev/null @@ -1,24 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.adapter.type; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import ca.spottedleaf.moonrise.common.config.type.Duration; -import java.lang.reflect.Type; - -public final class DurationTypeAdapter extends TypeAdapter { - - public static final DurationTypeAdapter INSTANCE = new DurationTypeAdapter(); - - @Override - public Duration deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (!(input instanceof String string)) { - throw new IllegalArgumentException("Not a string: " + input.getClass()); - } - return Duration.parse(string); - } - - @Override - public String serialize(final TypeAdapterRegistry registry, final Duration value, final Type type) { - return value.toString(); - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Adaptable.java b/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Adaptable.java deleted file mode 100644 index 3aa992a..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Adaptable.java +++ /dev/null @@ -1,15 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation used on a class to indicate that its type adapter may automatically be generated. The class must have - * a public no-args constructor. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Adaptable { -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Serializable.java b/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Serializable.java deleted file mode 100644 index 77c25c6..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/annotation/Serializable.java +++ /dev/null @@ -1,45 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.annotation; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.function.Function; - -/** - * Annotation indicating that a field should be deserialized or serialized from the config. - * By default, this annotation is not assumed. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface Serializable { - - /** - * Indicates whether this field is required to be present in the config. If the field is not present, - * and {@code required = true}, then an exception will be thrown during deserialization. If {@code required = false} - * and the field is not present, then the field value will remain unmodified. - */ - public boolean required() default false; - - /** - * The comment to apply before the element when serializing. - */ - public String comment() default ""; - - /** - * Adapter override class. The class must have a public no-args constructor. - */ - public Class adapter() default TypeAdapter.class; - - /** - * Whether to serialize the value to the config. - */ - public boolean serialize() default true; - - /** - * When not empty, this value overrides the auto generated serialized key in the config. - */ - public String serializedKey() default ""; - -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/config/YamlConfig.java b/src/main/java/ca/spottedleaf/moonrise/common/config/config/YamlConfig.java deleted file mode 100644 index 4178579..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/config/YamlConfig.java +++ /dev/null @@ -1,178 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.config; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.comments.CommentLine; -import org.yaml.snakeyaml.comments.CommentType; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.representer.Represent; -import org.yaml.snakeyaml.representer.Representer; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.AtomicMoveNotSupportedException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public final class YamlConfig { - - public final TypeAdapterRegistry typeAdapters; - - private final Class clazz; - - public volatile T config; - - private final Yaml yaml; - private final LoaderOptions loaderOptions; - private final DumperOptions dumperOptions; - - public YamlConfig(final Class clazz, final T dfl) throws Exception { - this(clazz, dfl, new TypeAdapterRegistry()); - } - - public YamlConfig(final Class clazz, final T dfl, final TypeAdapterRegistry registry) throws Exception { - this.clazz = clazz; - this.config = dfl; - this.typeAdapters = registry; - this.typeAdapters.makeAdapter(clazz); - - final LoaderOptions loaderOptions = new LoaderOptions(); - loaderOptions.setProcessComments(true); - - final DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setProcessComments(true); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - - this.loaderOptions = loaderOptions; - this.dumperOptions = dumperOptions; - this.yaml = new Yaml(new YamlConstructor(loaderOptions), new YamlRepresenter(dumperOptions), dumperOptions, loaderOptions); - } - - public void load(final File file) throws IOException { - try (final InputStream is = new BufferedInputStream(new FileInputStream(file))) { - this.load(is); - } - } - - public void load(final InputStream is) throws IOException { - final Object serialized = this.yaml.load(new InputStreamReader(is, StandardCharsets.UTF_8)); - - this.config = (T)this.typeAdapters.deserialize(serialized, this.clazz); - } - - public void save(final File file) throws IOException { - this.save(file, ""); - } - - public void save(final File file, final String header) throws IOException { - if (file.isDirectory()) { - throw new IOException("File is a directory"); - } - - final File parent = file.getParentFile(); - if (parent != null) { - parent.mkdirs(); - } - - final File tmp = new File(parent, file.getName() + ".tmp"); - tmp.delete(); - tmp.createNewFile(); - try { - try (final OutputStream os = new BufferedOutputStream(new FileOutputStream(tmp))) { - this.save(os, header); - } - - try { - Files.move(tmp.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); - } catch (final AtomicMoveNotSupportedException ex) { - Files.move(tmp.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING); - } - } finally { - tmp.delete(); - } - } - - public void save(final OutputStream os) throws IOException { - os.write(this.saveToString().getBytes(StandardCharsets.UTF_8)); - } - - public void save(final OutputStream os, final String header) throws IOException { - os.write(this.saveToString(header).getBytes(StandardCharsets.UTF_8)); - } - - public String saveToString() { - return this.yaml.dump(this.typeAdapters.serialize(this.config, this.clazz)); - } - - public String saveToString(final String header) { - if (header.isBlank()) { - return this.saveToString(); - } - - final StringBuilder ret = new StringBuilder(); - final String lineBreak = this.dumperOptions.getLineBreak().getString(); - - for (final String line : header.split("\n")) { - ret.append("# ").append(line.trim()).append(lineBreak); - } - - ret.append(lineBreak); - - return ret.append(this.saveToString()).toString(); - } - - public void callInitialisers() { - this.typeAdapters.callInitialisers(this.config); - } - - private static final class YamlConstructor extends Constructor { - - public YamlConstructor(final LoaderOptions loadingConfig) { - super(loadingConfig); - } - } - - private static final class YamlRepresenter extends Representer { - - public YamlRepresenter(final DumperOptions options) { - super(options); - - this.representers.put(TypeAdapterRegistry.CommentedData.class, new CommentedDataRepresenter()); - } - - private final class CommentedDataRepresenter implements Represent { - - @Override - public Node representData(final Object data0) { - final TypeAdapterRegistry.CommentedData commentedData = (TypeAdapterRegistry.CommentedData)data0; - - final Node node = YamlRepresenter.this.representData(commentedData.data); - - final List comments = new ArrayList<>(); - - for (final String line : commentedData.comment.split("\n")) { - comments.add(new CommentLine(null, null, " ".concat(line.trim()), CommentType.BLOCK)); - } - - node.setBlockComments(comments); - - return node; - } - } - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java index b1b3d0a..14c73d4 100644 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java +++ b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java @@ -1,12 +1,12 @@ package ca.spottedleaf.moonrise.common.config.moonrise; -import ca.spottedleaf.moonrise.common.config.InitialiseHook; -import ca.spottedleaf.moonrise.common.config.annotation.Adaptable; import ca.spottedleaf.moonrise.common.config.ui.ClothConfig; -import ca.spottedleaf.moonrise.common.config.annotation.Serializable; -import ca.spottedleaf.moonrise.common.config.type.Duration; import ca.spottedleaf.moonrise.common.util.MoonriseCommon; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler; +import ca.spottedleaf.yamlconfig.InitialiseHook; +import ca.spottedleaf.yamlconfig.annotation.Adaptable; +import ca.spottedleaf.yamlconfig.annotation.Serializable; +import ca.spottedleaf.yamlconfig.type.Duration; @Adaptable public final class MoonriseConfig { diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/adapter/DefaultedTypeAdapter.java b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/adapter/DefaultedTypeAdapter.java deleted file mode 100644 index 6dee481..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/adapter/DefaultedTypeAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.moonrise.adapter; - -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapter; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import ca.spottedleaf.moonrise.common.config.moonrise.type.DefaultedValue; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; - -public final class DefaultedTypeAdapter extends TypeAdapter, Object> { - - private static final String DEFAULT_STRING = "default"; - - @Override - public DefaultedValue deserialize(final TypeAdapterRegistry registry, final Object input, final Type type) { - if (input instanceof String string && string.equalsIgnoreCase(DEFAULT_STRING)) { - return new DefaultedValue<>(); - } - - if (!(type instanceof ParameterizedType parameterizedType)) { - throw new IllegalArgumentException("DefaultedValue field must specify generic type"); - } - final Type valueType = parameterizedType.getActualTypeArguments()[0]; - - return new DefaultedValue<>(registry.deserialize(input, valueType)); - } - - @Override - public Object serialize(final TypeAdapterRegistry registry, final DefaultedValue value, final Type type) { - final Object raw = value.getValueRaw(); - if (raw == null) { - return DEFAULT_STRING; - } - - final Type valueType = type instanceof ParameterizedType parameterizedType ? parameterizedType.getActualTypeArguments()[0] : null; - - return registry.serialize(raw, valueType); - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/type/DefaultedValue.java b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/type/DefaultedValue.java deleted file mode 100644 index 45c6e53..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/type/DefaultedValue.java +++ /dev/null @@ -1,22 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.moonrise.type; - -public final class DefaultedValue { - - private final T value; - - public DefaultedValue() { - this(null); - } - - public DefaultedValue(final T value) { - this.value = value; - } - - public T getValueRaw() { - return value; - } - - public T getOrDefault(final T dfl) { - return this.value != null ? this.value : dfl; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/type/Duration.java b/src/main/java/ca/spottedleaf/moonrise/common/config/type/Duration.java deleted file mode 100644 index 5c7cecd..0000000 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/type/Duration.java +++ /dev/null @@ -1,76 +0,0 @@ -package ca.spottedleaf.moonrise.common.config.type; - -import java.math.BigDecimal; - -public final class Duration { - - private final String string; - private final long timeNS; - - private Duration(final String string, final long timeNS) { - this.string = string; - this.timeNS = timeNS; - } - - public static Duration parse(final String value) { - if (value.length() < 2) { - throw new IllegalArgumentException("Invalid duration: " + value); - } - - final char last = value.charAt(value.length() - 1); - - final long multiplier; - - switch (last) { - case 's': { - multiplier = (1000L * 1000L * 1000L) * 1L; - break; - } - case 't': { - multiplier = (1000L * 1000L * 1000L) / 20L; - break; - } - case 'm': { - multiplier = (1000L * 1000L * 1000L) * 60L; - break; - } - case 'h': { - multiplier = (1000L * 1000L * 1000L) * 60L * 60L; - break; - } - case 'd': { - multiplier = (1000L * 1000L * 1000L) * 24L * 60L * 60L; - break; - } - default: { - throw new IllegalArgumentException("Duration must end with one of: [s, t, m, h, d]"); - } - } - - final BigDecimal parsed = new BigDecimal(value.substring(0, value.length() - 1)) - .multiply(new BigDecimal(multiplier)); - - return new Duration(value, parsed.toBigInteger().longValueExact()); - } - - public long getTimeNS() { - return this.timeNS; - } - - public long getTimeMS() { - return this.timeNS / (1000L * 1000L); - } - - public long getTimeS() { - return this.timeNS / (1000L * 1000L * 1000L); - } - - public long getTimeTicks() { - return this.timeNS / ((1000L * 1000L * 1000L) / (20L)); - } - - @Override - public String toString() { - return this.string; - } -} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ConfigHolder.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ConfigHolder.java index d2f97ef..f4f8d30 100644 --- a/src/main/java/ca/spottedleaf/moonrise/common/util/ConfigHolder.java +++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ConfigHolder.java @@ -1,11 +1,9 @@ package ca.spottedleaf.moonrise.common.util; import ca.spottedleaf.moonrise.common.PlatformHooks; -import ca.spottedleaf.moonrise.common.config.adapter.TypeAdapterRegistry; -import ca.spottedleaf.moonrise.common.config.config.YamlConfig; import ca.spottedleaf.moonrise.common.config.moonrise.MoonriseConfig; -import ca.spottedleaf.moonrise.common.config.moonrise.adapter.DefaultedTypeAdapter; -import ca.spottedleaf.moonrise.common.config.moonrise.type.DefaultedValue; +import ca.spottedleaf.yamlconfig.adapter.TypeAdapterRegistry; +import ca.spottedleaf.yamlconfig.config.YamlConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; @@ -18,8 +16,6 @@ public final class ConfigHolder { private static final TypeAdapterRegistry CONFIG_ADAPTERS = new TypeAdapterRegistry(); private static final YamlConfig CONFIG; static { - CONFIG_ADAPTERS.putAdapter(DefaultedValue.class, new DefaultedTypeAdapter()); - try { CONFIG = new YamlConfig<>(MoonriseConfig.class, new MoonriseConfig(), CONFIG_ADAPTERS); } catch (final Exception ex) {