Lortseam 4 年之前
父節點
當前提交
98af2e04e2

+ 5 - 5
lib/src/main/java/me/lortseam/completeconfig/data/BaseCollection.java

@@ -3,9 +3,9 @@ package me.lortseam.completeconfig.data;
 import com.google.common.collect.Iterables;
 import me.lortseam.completeconfig.api.ConfigContainer;
 import me.lortseam.completeconfig.api.ConfigGroup;
-import me.lortseam.completeconfig.data.client.Translatable;
-import me.lortseam.completeconfig.data.structure.DataPart;
-import me.lortseam.completeconfig.data.structure.ParentDataPart;
+import me.lortseam.completeconfig.data.structure.ParentStructurePart;
+import me.lortseam.completeconfig.data.structure.StructurePart;
+import me.lortseam.completeconfig.data.structure.client.Translatable;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import me.lortseam.completeconfig.util.ReflectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -15,7 +15,7 @@ import java.lang.reflect.Modifier;
 import java.util.Arrays;
 import java.util.Collections;
 
-abstract class BaseCollection implements ParentDataPart, Translatable {
+abstract class BaseCollection implements ParentStructurePart, Translatable {
 
     private final EntrySet entries = new EntrySet(this);
     private final CollectionSet collections = new CollectionSet(this);
@@ -84,7 +84,7 @@ abstract class BaseCollection implements ParentDataPart, Translatable {
     }
 
     @Override
-    public final Iterable<DataPart> getChildren() {
+    public final Iterable<StructurePart> getChildren() {
         return Iterables.concat(entries, collections);
     }
 

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/Collection.java

@@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.api.ConfigGroup;
 import me.lortseam.completeconfig.data.structure.Identifiable;
-import me.lortseam.completeconfig.data.client.TooltipSupplier;
+import me.lortseam.completeconfig.data.structure.client.TooltipSupplier;
 import me.lortseam.completeconfig.text.TranslationKey;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;

+ 69 - 10
lib/src/main/java/me/lortseam/completeconfig/data/Config.java

@@ -1,18 +1,26 @@
 package me.lortseam.completeconfig.data;
 
-import lombok.AccessLevel;
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.ToString;
 import lombok.extern.log4j.Log4j2;
+import me.lortseam.completeconfig.CompleteConfig;
 import me.lortseam.completeconfig.api.ConfigContainer;
-import me.lortseam.completeconfig.io.ConfigSource;
+import me.lortseam.completeconfig.data.serialize.ClientSerializers;
+import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
 import me.lortseam.completeconfig.text.TranslationKey;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.metadata.ModMetadata;
+import org.apache.commons.lang3.ArrayUtils;
+import org.spongepowered.configurate.CommentedConfigurationNode;
+import org.spongepowered.configurate.ConfigurateException;
+import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Objects;
 
@@ -20,12 +28,29 @@ import java.util.Objects;
  * The base config class. Instantiate or inherit this class to create a config for your mod.
  */
 @Log4j2(topic = "CompleteConfig")
+@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
 @ToString(onlyExplicitlyIncluded = true)
 public class Config extends BaseCollection {
 
-    @Getter(AccessLevel.PACKAGE)
+    private static final TypeSerializerCollection GLOBAL_TYPE_SERIALIZERS;
+
+    static {
+        TypeSerializerCollection.Builder builder = TypeSerializerCollection.builder();
+        if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
+            builder.registerAll(ClientSerializers.COLLECTION);
+        }
+        GLOBAL_TYPE_SERIALIZERS = builder.build();
+    }
+
+    @EqualsAndHashCode.Include
+    @ToString.Include
+    @Getter
+    private final String modId;
+    @EqualsAndHashCode.Include
     @ToString.Include
-    private final ConfigSource source;
+    @Getter
+    private final String[] branch;
+    private final HoconConfigurationLoader loader;
     private Runnable resolver;
     @Environment(EnvType.CLIENT)
     private TranslationKey translation;
@@ -39,9 +64,28 @@ public class Config extends BaseCollection {
      * @param branch the branch
      */
     public Config(String modId, String[] branch, @NonNull ConfigContainer... containers) {
-        source = new ConfigSource(modId, branch);
-        ConfigRegistry.register(this);
+        if (!FabricLoader.getInstance().isModLoaded(modId)) {
+            throw new IllegalArgumentException("Mod " + modId + " is not loaded");
+        }
+        Arrays.stream(branch).forEach(Objects::requireNonNull);
         Arrays.stream(containers).forEach(Objects::requireNonNull);
+        this.modId = modId;
+        this.branch = branch;
+        Path path = FabricLoader.getInstance().getConfigDir();
+        String[] subPath = ArrayUtils.add(branch, 0, modId);
+        subPath[subPath.length - 1] = subPath[subPath.length - 1] + ".conf";
+        for (String child : subPath) {
+            path = path.resolve(child);
+        }
+        loader = HoconConfigurationLoader.builder()
+                .path(path)
+                .defaultOptions(options -> options.serializers(builder -> {
+                    builder.registerAll(GLOBAL_TYPE_SERIALIZERS);
+                    for (TypeSerializerCollection typeSerializers : CompleteConfig.collectExtensions(CompleteConfigExtension.class, CompleteConfigExtension::getTypeSerializers)) {
+                        builder.registerAll(typeSerializers);
+                    }
+                }))
+                .build();
         resolver = () -> {
             if (this instanceof ConfigContainer) {
                 resolve((ConfigContainer) this);
@@ -51,6 +95,7 @@ public class Config extends BaseCollection {
                 logger.warn(this + " is empty");
             }
         };
+        ConfigRegistry.register(this);
     }
 
     /**
@@ -63,7 +108,7 @@ public class Config extends BaseCollection {
     }
 
     public final ModMetadata getMod() {
-        return FabricLoader.getInstance().getModContainer(source.getModId()).get().getMetadata();
+        return FabricLoader.getInstance().getModContainer(modId).get().getMetadata();
     }
 
     @Override
@@ -77,7 +122,7 @@ public class Config extends BaseCollection {
             translation = TranslationKey.from(this);
         }
         if (includeBranch) {
-            return translation.append(source.getBranch());
+            return translation.append(branch);
         }
         return translation;
     }
@@ -93,7 +138,15 @@ public class Config extends BaseCollection {
             resolver = null;
         }
         if (isEmpty()) return;
-        source.load(this);
+        try {
+            CommentedConfigurationNode root = loader.load();
+            if (!root.isNull()) {
+                apply(root);
+            }
+        } catch (ConfigurateException e) {
+            logger.error("Failed to load config from file", e);
+        }
+        save();
     }
 
     /**
@@ -104,7 +157,13 @@ public class Config extends BaseCollection {
             throw new IllegalStateException("Cannot save config before it was loaded");
         }
         if (isEmpty()) return;
-        source.save(this);
+        CommentedConfigurationNode root = loader.createNode();
+        fetch(root);
+        try {
+            loader.save(root);
+        } catch (ConfigurateException e) {
+            logger.error("Failed to save config to file", e);
+        }
     }
 
 }

+ 4 - 5
lib/src/main/java/me/lortseam/completeconfig/data/ConfigRegistry.java

@@ -5,17 +5,16 @@ import lombok.NonNull;
 import lombok.experimental.UtilityClass;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.data.transform.Transformation;
-import me.lortseam.completeconfig.io.ConfigSource;
 import me.lortseam.completeconfig.util.ReflectionUtils;
 import net.minecraft.text.TextColor;
 
-import java.util.*;
 import java.util.Collection;
+import java.util.*;
 
 @UtilityClass
 public final class ConfigRegistry {
 
-    private static final Set<ConfigSource> sources = new HashSet<>();
+    private static final Set<Config> configs = new HashSet<>();
     private static final Map<String, Config> mainConfigs = new HashMap<>();
     private static final Set<EntryOrigin> origins = new HashSet<>();
     private static final List<Transformation> transformations = Lists.newArrayList(
@@ -51,8 +50,8 @@ public final class ConfigRegistry {
     );
 
     static void register(Config config) {
-        if (!sources.add(config.getSource())) {
-            throw new UnsupportedOperationException(config.getSource() + " already exists");
+        if (!configs.add(config)) {
+            throw new UnsupportedOperationException(config + " already exists");
         }
         String modId = config.getMod().getId();
         if (!mainConfigs.containsKey(modId)) {

+ 2 - 2
lib/src/main/java/me/lortseam/completeconfig/data/DataSet.java

@@ -2,7 +2,7 @@ package me.lortseam.completeconfig.data;
 
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
-import me.lortseam.completeconfig.data.structure.DataPart;
+import me.lortseam.completeconfig.data.structure.StructurePart;
 import me.lortseam.completeconfig.data.structure.Identifiable;
 import org.jetbrains.annotations.NotNull;
 
@@ -12,7 +12,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-abstract class DataSet<T extends DataPart & Identifiable> extends AbstractSet<T> {
+abstract class DataSet<T extends StructurePart & Identifiable> extends AbstractSet<T> {
 
     protected final BaseCollection parent;
     private final Map<String, T> map = new LinkedHashMap<>();

+ 4 - 4
lib/src/main/java/me/lortseam/completeconfig/data/Entry.java

@@ -7,9 +7,9 @@ import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.CompleteConfig;
 import me.lortseam.completeconfig.api.ConfigContainer;
 import me.lortseam.completeconfig.api.ConfigEntry;
-import me.lortseam.completeconfig.data.client.TooltipSupplier;
-import me.lortseam.completeconfig.data.client.Translatable;
-import me.lortseam.completeconfig.data.structure.DataPart;
+import me.lortseam.completeconfig.data.structure.StructurePart;
+import me.lortseam.completeconfig.data.structure.client.TooltipSupplier;
+import me.lortseam.completeconfig.data.structure.client.Translatable;
 import me.lortseam.completeconfig.data.structure.Identifiable;
 import me.lortseam.completeconfig.data.transform.Transformation;
 import me.lortseam.completeconfig.data.transform.Transformer;
@@ -31,7 +31,7 @@ import java.util.Optional;
 import java.util.function.UnaryOperator;
 
 @Log4j2(topic = "CompleteConfig")
-public class Entry<T> implements DataPart, Identifiable, Translatable, TooltipSupplier {
+public class Entry<T> implements StructurePart, Identifiable, Translatable, TooltipSupplier {
 
     private static final Transformer DEFAULT_TRANSFORMER = Entry::new;
 

+ 3 - 3
lib/src/main/java/me/lortseam/completeconfig/io/ClientSerializers.java → lib/src/main/java/me/lortseam/completeconfig/data/serialize/ClientSerializers.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.io;
+package me.lortseam.completeconfig.data.serialize;
 
 import lombok.experimental.UtilityClass;
 import net.fabricmc.api.EnvType;
@@ -10,7 +10,7 @@ import org.spongepowered.configurate.serialize.TypeSerializer;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
 @UtilityClass
-final class ClientSerializers {
+public final class ClientSerializers {
 
     private static final ScalarSerializer<TextColor> TEXT_COLOR = TypeSerializer.of(TextColor.class, (v, pass) -> v.getRgb(), v -> {
         if (v instanceof Integer) {
@@ -20,7 +20,7 @@ final class ClientSerializers {
     });
 
     @Environment(EnvType.CLIENT)
-    final static TypeSerializerCollection COLLECTION = TypeSerializerCollection.builder()
+    public final static TypeSerializerCollection COLLECTION = TypeSerializerCollection.builder()
             .registerExact(TEXT_COLOR)
             .build();
 

+ 3 - 3
lib/src/main/java/me/lortseam/completeconfig/data/structure/ParentDataPart.java → lib/src/main/java/me/lortseam/completeconfig/data/structure/ParentStructurePart.java

@@ -5,18 +5,18 @@ import org.spongepowered.configurate.CommentedConfigurationNode;
 import java.util.function.BiConsumer;
 import java.util.function.Predicate;
 
-public interface ParentDataPart<C extends DataPart & Identifiable> extends DataPart {
+public interface ParentStructurePart<C extends StructurePart & Identifiable> extends StructurePart {
 
     Iterable<C> getChildren();
 
     @Override
     default void apply(CommentedConfigurationNode node) {
-        propagateToChildren(childNode -> !childNode.isNull(), DataPart::apply, node);
+        propagateToChildren(childNode -> !childNode.isNull(), StructurePart::apply, node);
     }
 
     @Override
     default void fetch(CommentedConfigurationNode node) {
-        propagateToChildren(childNode -> true, DataPart::fetch, node);
+        propagateToChildren(childNode -> true, StructurePart::fetch, node);
     }
 
     default void propagateToChildren(Predicate<CommentedConfigurationNode> childNodeCondition, BiConsumer<C, CommentedConfigurationNode> function, CommentedConfigurationNode node) {

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/structure/DataPart.java → lib/src/main/java/me/lortseam/completeconfig/data/structure/StructurePart.java

@@ -2,7 +2,7 @@ package me.lortseam.completeconfig.data.structure;
 
 import org.spongepowered.configurate.CommentedConfigurationNode;
 
-public interface DataPart {
+public interface StructurePart {
 
     void apply(CommentedConfigurationNode node);
 

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/client/TooltipSupplier.java → lib/src/main/java/me/lortseam/completeconfig/data/structure/client/TooltipSupplier.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.data.client;
+package me.lortseam.completeconfig.data.structure.client;
 
 import me.lortseam.completeconfig.text.TranslationKey;
 import net.fabricmc.api.EnvType;

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/client/Translatable.java → lib/src/main/java/me/lortseam/completeconfig/data/structure/client/Translatable.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.data.client;
+package me.lortseam.completeconfig.data.structure.client;
 
 import me.lortseam.completeconfig.text.TranslationKey;
 import net.fabricmc.api.EnvType;

+ 0 - 94
lib/src/main/java/me/lortseam/completeconfig/io/ConfigSource.java

@@ -1,94 +0,0 @@
-package me.lortseam.completeconfig.io;
-
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.ToString;
-import lombok.extern.log4j.Log4j2;
-import me.lortseam.completeconfig.CompleteConfig;
-import me.lortseam.completeconfig.data.structure.DataPart;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.loader.api.FabricLoader;
-import org.apache.commons.lang3.ArrayUtils;
-import org.spongepowered.configurate.CommentedConfigurationNode;
-import org.spongepowered.configurate.ConfigurateException;
-import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
-import org.spongepowered.configurate.serialize.TypeSerializerCollection;
-
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.Objects;
-
-@Log4j2(topic = "CompleteConfig")
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
-@ToString(onlyExplicitlyIncluded = true)
-public final class ConfigSource {
-
-    private static final TypeSerializerCollection GLOBAL_TYPE_SERIALIZERS;
-
-    static {
-        TypeSerializerCollection.Builder builder = TypeSerializerCollection.builder();
-        if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
-            builder.registerAll(ClientSerializers.COLLECTION);
-        }
-        GLOBAL_TYPE_SERIALIZERS = builder.build();
-    }
-
-    @EqualsAndHashCode.Include
-    @ToString.Include
-    @Getter
-    private final String modId;
-    @EqualsAndHashCode.Include
-    @ToString.Include
-    @Getter
-    private final String[] branch;
-    private final HoconConfigurationLoader loader;
-
-    public ConfigSource(@NonNull String modId, @NonNull String[] branch) {
-        if (!FabricLoader.getInstance().isModLoaded(modId)) {
-            throw new IllegalArgumentException("Mod " + modId + " is not loaded");
-        }
-        Arrays.stream(branch).forEach(Objects::requireNonNull);
-        this.modId = modId;
-        this.branch = branch;
-        Path path = FabricLoader.getInstance().getConfigDir();
-        String[] subPath = ArrayUtils.add(branch, 0, modId);
-        subPath[subPath.length - 1] = subPath[subPath.length - 1] + ".conf";
-        for (String child : subPath) {
-            path = path.resolve(child);
-        }
-        loader = HoconConfigurationLoader.builder()
-                .path(path)
-                .defaultOptions(options -> options.serializers(builder -> {
-                    builder.registerAll(GLOBAL_TYPE_SERIALIZERS);
-                    for (TypeSerializerCollection typeSerializers : CompleteConfig.collectExtensions(CompleteConfigExtension.class, CompleteConfigExtension::getTypeSerializers)) {
-                        builder.registerAll(typeSerializers);
-                    }
-                }))
-                .build();
-    }
-
-    public void load(DataPart data) {
-        try {
-            CommentedConfigurationNode rootNode = loader.load();
-            if (!rootNode.isNull()) {
-                data.apply(rootNode);
-            }
-        } catch (ConfigurateException e) {
-            logger.error("Failed to load config from file", e);
-        }
-        save(data);
-    }
-
-    public void save(DataPart data) {
-        CommentedConfigurationNode rootNode = loader.createNode();
-        data.fetch(rootNode);
-        try {
-            loader.save(rootNode);
-        } catch (ConfigurateException e) {
-            logger.error("Failed to save config to file", e);
-        }
-    }
-
-}