Ver código fonte

Enhanced the extension system

Lortseam 4 anos atrás
pai
commit
f642a74557

+ 0 - 3
example/src/main/java/me/lortseam/completeconfig/example/Settings.java

@@ -4,8 +4,6 @@ import me.lortseam.completeconfig.api.ConfigContainer;
 import me.lortseam.completeconfig.api.ConfigEntries;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.api.ConfigGroup;
-import net.minecraft.text.TextColor;
-import net.minecraft.util.Formatting;
 
 import java.util.Arrays;
 import java.util.List;
@@ -28,7 +26,6 @@ public final class Settings implements ConfigContainer {
         private String string = "";
         private AnEnum anEnum = AnEnum.FOO;
         private List<String> list = Arrays.asList("First entry", "Second entry");
-        private TextColor color = TextColor.fromFormatting(Formatting.BLUE);
 
     }
 

+ 18 - 3
lib/src/main/java/me/lortseam/completeconfig/CompleteConfig.java

@@ -3,6 +3,7 @@ package me.lortseam.completeconfig;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
+import me.lortseam.completeconfig.extensions.ConfigExtensionPattern;
 import me.lortseam.completeconfig.extensions.clothbasicmath.ClothBasicMathExtension;
 import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
@@ -17,7 +18,7 @@ import java.util.Map;
 @Log4j2
 public final class CompleteConfig {
 
-    private static final Map<String, CompleteConfigExtension> extensions = new HashMap<>();
+    private static final Map<String, ConfigExtensionPattern> extensions = new HashMap<>();
 
     static {
         registerExternalExtension("cloth-basic-math", ClothBasicMathExtension.class);
@@ -33,13 +34,27 @@ public final class CompleteConfig {
             if (!constructor.isAccessible()) {
                 constructor.setAccessible(true);
             }
-            extensions.put(modID, constructor.newInstance());
+            CompleteConfigExtension extension = constructor.newInstance();
+            extensions.put(modID, extension);
+            ConfigExtensionPattern envSpecificExtension = null;
+            switch (FabricLoader.getInstance().getEnvironmentType()) {
+                case CLIENT:
+                    envSpecificExtension = extension.client();
+                    break;
+
+                case SERVER:
+                    envSpecificExtension = extension.server();
+                    break;
+            }
+            if (envSpecificExtension != null) {
+                extensions.put(modID, envSpecificExtension);
+            }
         } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
             logger.error("[CompleteConfig] Failed to instantiate extension " + modID, e);
         }
     }
 
-    public static Collection<CompleteConfigExtension> getExtensions() {
+    public static Collection<ConfigExtensionPattern> getExtensions() {
         return Collections.unmodifiableCollection(extensions.values());
     }
 

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

@@ -13,7 +13,7 @@ import me.lortseam.completeconfig.data.entry.Transformation;
 import me.lortseam.completeconfig.data.structure.DataPart;
 import me.lortseam.completeconfig.data.text.TranslationIdentifier;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
+import me.lortseam.completeconfig.extensions.ConfigExtensionPattern;
 import net.minecraft.text.Text;
 import net.minecraft.text.TextColor;
 import org.apache.commons.lang3.StringUtils;
@@ -56,7 +56,7 @@ public class Entry<T> extends EntryBase<T> implements DataPart {
     private static final BiMap<Key, EntryBase> entries = HashBiMap.create();
 
     static {
-        CompleteConfig.getExtensions().stream().map(CompleteConfigExtension::getTransformations).filter(Objects::nonNull).forEach(extensionTransformations -> {
+        CompleteConfig.getExtensions().stream().map(ConfigExtensionPattern::getTransformations).filter(Objects::nonNull).forEach(extensionTransformations -> {
             transformations.addAll(0, extensionTransformations);
         });
     }

+ 3 - 8
lib/src/main/java/me/lortseam/completeconfig/extensions/CompleteConfigExtension.java

@@ -1,17 +1,12 @@
 package me.lortseam.completeconfig.extensions;
 
-import me.lortseam.completeconfig.data.entry.Transformation;
-import org.spongepowered.configurate.serialize.TypeSerializerCollection;
+public interface CompleteConfigExtension extends ConfigExtensionPattern {
 
-import java.util.Collection;
-
-public interface CompleteConfigExtension {
-
-    default TypeSerializerCollection getTypeSerializers() {
+    default ConfigExtensionPattern client() {
         return null;
     }
 
-    default Collection<Transformation> getTransformations() {
+    default ConfigExtensionPattern server() {
         return null;
     }
 

+ 24 - 0
lib/src/main/java/me/lortseam/completeconfig/extensions/ConfigExtensionPattern.java

@@ -0,0 +1,24 @@
+package me.lortseam.completeconfig.extensions;
+
+import me.lortseam.completeconfig.data.entry.Transformation;
+import net.fabricmc.loader.api.FabricLoader;
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
+
+import java.util.Collection;
+
+public interface ConfigExtensionPattern {
+
+    default TypeSerializerCollection getTypeSerializers() {
+        return null;
+    }
+
+    default Collection<Transformation> getTransformations() {
+        return null;
+    }
+
+    default void dependOn(String dependentModID, Runnable runnable) {
+        if(!FabricLoader.getInstance().isModLoaded(dependentModID)) return;
+        runnable.run();
+    }
+
+}

+ 22 - 0
lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ClothBasicMathClientExtension.java

@@ -0,0 +1,22 @@
+package me.lortseam.completeconfig.extensions.clothbasicmath;
+
+import me.lortseam.completeconfig.data.ColorEntry;
+import me.lortseam.completeconfig.extensions.ConfigExtensionPattern;
+import me.lortseam.completeconfig.gui.cloth.GuiRegistry;
+import me.shedaniel.math.Color;
+
+public final class ClothBasicMathClientExtension implements ConfigExtensionPattern {
+
+    ClothBasicMathClientExtension() {
+        dependOn("cloth-config2", () -> GuiRegistry.addGlobalRegistrar(registry -> registry.registerColorProvider((ColorEntry<Color> entry) -> GuiRegistry.build(
+                builder -> builder
+                        .startColorField(entry.getText(), entry.getValue())
+                        .setAlphaMode(entry.isAlphaMode())
+                        .setDefaultValue(entry.getDefaultValue().getColor())
+                        .setTooltip(entry.getTooltip())
+                        .setSaveConsumer2(entry::setValue),
+                entry.requiresRestart()
+        ), true, Color.class)));
+    }
+
+}

+ 9 - 16
lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ClothBasicMathExtension.java

@@ -1,32 +1,20 @@
 package me.lortseam.completeconfig.extensions.clothbasicmath;
 
 import com.google.common.collect.ImmutableList;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import me.lortseam.completeconfig.data.ColorEntry;
 import me.lortseam.completeconfig.data.entry.Transformation;
 import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
-import me.lortseam.completeconfig.gui.cloth.GuiRegistry;
+import me.lortseam.completeconfig.extensions.ConfigExtensionPattern;
 import me.shedaniel.math.Color;
-import net.fabricmc.loader.api.FabricLoader;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
 import java.util.Collection;
 
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ClothBasicMathExtension implements CompleteConfigExtension {
 
-    private ClothBasicMathExtension() {
-        if (FabricLoader.getInstance().isModLoaded("cloth-config2")) {
-            GuiRegistry.addGlobalRegistrar(registry -> registry.registerColorProvider((ColorEntry<Color> entry) -> GuiRegistry.build(
-                    builder -> builder
-                            .startColorField(entry.getText(), entry.getValue())
-                            .setAlphaMode(entry.isAlphaMode())
-                            .setDefaultValue(entry.getDefaultValue().getColor())
-                            .setTooltip(entry.getTooltip())
-                            .setSaveConsumer2(entry::setValue),
-                    entry.requiresRestart()
-            ), true, Color.class));
-        }
-    }
-
     @Override
     public TypeSerializerCollection getTypeSerializers() {
         return TypeSerializerCollection.builder()
@@ -41,4 +29,9 @@ public final class ClothBasicMathExtension implements CompleteConfigExtension {
         );
     }
 
+    @Override
+    public ConfigExtensionPattern client() {
+        return new ClothBasicMathClientExtension();
+    }
+
 }

+ 13 - 5
lib/src/main/java/me/lortseam/completeconfig/io/ConfigSource.java

@@ -6,7 +6,7 @@ import lombok.ToString;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.CompleteConfig;
 import me.lortseam.completeconfig.data.Config;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
+import me.lortseam.completeconfig.extensions.ConfigExtensionPattern;
 import net.fabricmc.loader.api.FabricLoader;
 import org.apache.commons.lang3.ArrayUtils;
 import org.spongepowered.configurate.CommentedConfigurationNode;
@@ -25,11 +25,19 @@ import java.util.Set;
 @ToString(onlyExplicitlyIncluded = true)
 public final class ConfigSource {
 
-    private static final TypeSerializerCollection GLOBAL_TYPE_SERIALIZERS = TypeSerializerCollection.builder()
-            .registerExact(TextColorSerializer.INSTANCE)
-            .build();
+    private static final TypeSerializerCollection GLOBAL_TYPE_SERIALIZERS;
     private static final Set<ConfigSource> sources = new HashSet<>();
 
+    static {
+        TypeSerializerCollection.Builder builder = TypeSerializerCollection.builder();
+        switch (FabricLoader.getInstance().getEnvironmentType()) {
+            case CLIENT:
+                builder.registerExact(TextColorSerializer.INSTANCE);
+                break;
+        }
+        GLOBAL_TYPE_SERIALIZERS = builder.build();
+    }
+
     @EqualsAndHashCode.Include
     @ToString.Include
     @Getter
@@ -55,7 +63,7 @@ public final class ConfigSource {
                 .path(path)
                 .defaultOptions(options -> options.serializers(builder -> {
                     builder.registerAll(GLOBAL_TYPE_SERIALIZERS);
-                    CompleteConfig.getExtensions().stream().map(CompleteConfigExtension::getTypeSerializers).filter(Objects::nonNull).forEach(builder::registerAll);
+                    CompleteConfig.getExtensions().stream().map(ConfigExtensionPattern::getTypeSerializers).filter(Objects::nonNull).forEach(builder::registerAll);
                 }))
                 .build();
     }

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/io/TextColorSerializer.java

@@ -21,7 +21,7 @@ final class TextColorSerializer extends ScalarSerializer<TextColor> {
         if (obj instanceof Integer) {
             return TextColor.fromRgb((Integer) obj);
         }
-        throw new CoercionFailedException(type, obj, "TextColor");
+        throw new CoercionFailedException(type, obj, TextColor.class.getSimpleName());
     }
 
     @Override