Parcourir la source

Extend extension system

Lortseam il y a 4 ans
Parent
commit
a5f694007c
17 fichiers modifiés avec 117 ajouts et 138 suppressions
  1. 13 11
      lib/src/main/java/me/lortseam/completeconfig/CompleteConfig.java
  2. 0 5
      lib/src/main/java/me/lortseam/completeconfig/data/ColorEntry.java
  3. 2 14
      lib/src/main/java/me/lortseam/completeconfig/data/Config.java
  4. 1 34
      lib/src/main/java/me/lortseam/completeconfig/data/ConfigRegistry.java
  5. 2 2
      lib/src/main/java/me/lortseam/completeconfig/data/Entry.java
  6. 0 27
      lib/src/main/java/me/lortseam/completeconfig/data/serialize/ClientSerializers.java
  7. 34 1
      lib/src/main/java/me/lortseam/completeconfig/data/transform/Transformation.java
  8. 2 2
      lib/src/main/java/me/lortseam/completeconfig/extension/BaseExtension.java
  9. 5 0
      lib/src/main/java/me/lortseam/completeconfig/extension/ClientExtension.java
  10. 1 1
      lib/src/main/java/me/lortseam/completeconfig/extension/Extension.java
  11. 5 0
      lib/src/main/java/me/lortseam/completeconfig/extension/ServerExtension.java
  12. 12 5
      lib/src/main/java/me/lortseam/completeconfig/extension/clothbasicmath/ClothBasicMathExtension.java
  13. 2 2
      lib/src/main/java/me/lortseam/completeconfig/extension/clothbasicmath/ClothBasicMathGuiExtension.java
  14. 2 1
      lib/src/main/java/me/lortseam/completeconfig/extension/clothconfig/GuiExtension.java
  15. 35 0
      lib/src/main/java/me/lortseam/completeconfig/extension/minecraft/MinecraftClientExtension.java
  16. 0 32
      lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ColorSerializer.java
  17. 1 1
      lib/src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderRegistry.java

+ 13 - 11
lib/src/main/java/me/lortseam/completeconfig/CompleteConfig.java

@@ -4,15 +4,14 @@ import com.google.common.collect.Sets;
 import lombok.NonNull;
 import lombok.experimental.UtilityClass;
 import lombok.extern.log4j.Log4j2;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
-import me.lortseam.completeconfig.extensions.Extension;
-import me.lortseam.completeconfig.extensions.GuiExtension;
-import me.lortseam.completeconfig.extensions.clothbasicmath.ClothBasicMathExtension;
+import me.lortseam.completeconfig.extension.*;
+import me.lortseam.completeconfig.extension.clothbasicmath.ClothBasicMathExtension;
+import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
+import me.lortseam.completeconfig.extension.minecraft.MinecraftClientExtension;
 import me.lortseam.completeconfig.util.ReflectionUtils;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
-import org.apache.commons.lang3.ClassUtils;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
@@ -23,13 +22,16 @@ import java.util.stream.Collectors;
 @UtilityClass
 public final class CompleteConfig {
 
-    private static final Set<Class<? extends Extension>> validExtensionTypes = Sets.newHashSet(CompleteConfigExtension.class);
+    private static final Set<Class<? extends Extension>> validExtensionTypes = Sets.newHashSet(BaseExtension.class);
     private static final Set<Extension> extensions = new HashSet<>();
 
     static {
+        registerExtensionType(ClientExtension.class, EnvType.CLIENT);
+        registerExtensionType(ServerExtension.class, EnvType.SERVER);
         registerExtensionType(GuiExtension.class, EnvType.CLIENT, "cloth-config2");
+        registerExtension(MinecraftClientExtension.class);
         registerExtension("cloth-basic-math", ClothBasicMathExtension.class);
-        for (EntrypointContainer<CompleteConfigExtension> entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", CompleteConfigExtension.class)) {
+        for (EntrypointContainer<BaseExtension> entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", BaseExtension.class)) {
             registerExtension(entrypoint.getEntrypoint());
         }
     }
@@ -69,7 +71,7 @@ public final class CompleteConfig {
     }
 
     private static void registerExtension(Class<? extends Extension> extension) {
-        if(Collections.disjoint(ClassUtils.getAllInterfaces(extension), validExtensionTypes)) return;
+        if(!validExtensionTypes.containsAll(Arrays.asList(extension.getInterfaces()))) return;
         try {
             registerExtension(ReflectionUtils.instantiateClass(extension));
         } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
@@ -79,14 +81,14 @@ public final class CompleteConfig {
 
     /**
      * Registers an external CompleteConfig extension. To register an extension provided by your own mod, use the
-     * {@link CompleteConfigExtension} entrypoint.
+     * {@link BaseExtension} entrypoint.
      *
      * @param modId the ID of the external mod
      * @param extension the extension
      *
-     * @see CompleteConfigExtension
+     * @see BaseExtension
      */
-    public static void registerExtension(@NonNull String modId, @NonNull Class<? extends CompleteConfigExtension> extension) {
+    public static void registerExtension(@NonNull String modId, @NonNull Class<? extends BaseExtension> extension) {
         if(!FabricLoader.getInstance().isModLoaded(modId)) return;
         registerExtension(extension);
     }

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

@@ -1,7 +1,6 @@
 package me.lortseam.completeconfig.data;
 
 import lombok.Getter;
-import me.lortseam.completeconfig.api.ConfigEntry;
 
 public class ColorEntry<T> extends Entry<T> {
 
@@ -13,8 +12,4 @@ public class ColorEntry<T> extends Entry<T> {
         this.alphaMode = alphaMode;
     }
 
-    ColorEntry(EntryOrigin origin) {
-        this(origin, origin.getAnnotation(ConfigEntry.Color.class).alphaMode());
-    }
-
 }

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

@@ -7,8 +7,7 @@ import lombok.ToString;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.CompleteConfig;
 import me.lortseam.completeconfig.api.ConfigContainer;
-import me.lortseam.completeconfig.data.serialize.ClientSerializers;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
+import me.lortseam.completeconfig.extension.BaseExtension;
 import me.lortseam.completeconfig.text.TranslationKey;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
@@ -32,16 +31,6 @@ import java.util.Objects;
 @ToString(onlyExplicitlyIncluded = true)
 public class Config extends BaseCollection {
 
-    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
@@ -80,8 +69,7 @@ public class Config extends BaseCollection {
         loader = HoconConfigurationLoader.builder()
                 .path(path)
                 .defaultOptions(options -> options.serializers(builder -> {
-                    builder.registerAll(GLOBAL_TYPE_SERIALIZERS);
-                    for (TypeSerializerCollection typeSerializers : CompleteConfig.collectExtensions(CompleteConfigExtension.class, CompleteConfigExtension::getTypeSerializers)) {
+                    for (TypeSerializerCollection typeSerializers : CompleteConfig.collectExtensions(BaseExtension.class, BaseExtension::getTypeSerializers)) {
                         builder.registerAll(typeSerializers);
                     }
                 }))

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

@@ -3,10 +3,7 @@ package me.lortseam.completeconfig.data;
 import com.google.common.collect.Lists;
 import lombok.NonNull;
 import lombok.experimental.UtilityClass;
-import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.data.transform.Transformation;
-import me.lortseam.completeconfig.util.ReflectionUtils;
-import net.minecraft.text.TextColor;
 
 import java.util.Collection;
 import java.util.*;
@@ -17,37 +14,7 @@ public final class ConfigRegistry {
     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(
-            Transformation.builder().byType(boolean.class, Boolean.class).byAnnotation(ConfigEntry.Boolean.class, true).transforms(BooleanEntry::new),
-            Transformation.builder().byType(int.class, Integer.class).byAnnotation(ConfigEntry.BoundedInteger.class).transforms(origin -> {
-                ConfigEntry.BoundedInteger bounds = origin.getAnnotation(ConfigEntry.BoundedInteger.class);
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(int.class, Integer.class).byAnnotation(Arrays.asList(ConfigEntry.BoundedInteger.class, ConfigEntry.Slider.class)).transforms(origin -> {
-                ConfigEntry.BoundedInteger bounds = origin.getAnnotation(ConfigEntry.BoundedInteger.class);
-                return new SliderEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(long.class, Long.class).byAnnotation(ConfigEntry.BoundedLong.class).transforms(origin -> {
-                ConfigEntry.BoundedLong bounds = origin.getAnnotation(ConfigEntry.BoundedLong.class);
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(long.class, Long.class).byAnnotation(Arrays.asList(ConfigEntry.BoundedLong.class, ConfigEntry.Slider.class)).transforms(origin -> {
-                ConfigEntry.BoundedLong bounds = origin.getAnnotation(ConfigEntry.BoundedLong.class);
-                return new SliderEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(float.class, Float.class).byAnnotation(ConfigEntry.BoundedFloat.class).transforms(origin -> {
-                ConfigEntry.BoundedFloat bounds = origin.getAnnotation(ConfigEntry.BoundedFloat.class);
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(double.class, Double.class).byAnnotation(ConfigEntry.BoundedDouble.class).transforms(origin -> {
-                ConfigEntry.BoundedDouble bounds = origin.getAnnotation(ConfigEntry.BoundedDouble.class);
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
-            }),
-            Transformation.builder().byType(type -> Enum.class.isAssignableFrom(ReflectionUtils.getTypeClass(type))).transforms(EnumEntry::new),
-            Transformation.builder().byType(type -> Enum.class.isAssignableFrom(ReflectionUtils.getTypeClass(type))).byAnnotation(ConfigEntry.Dropdown.class).transforms(DropdownEntry::new),
-            Transformation.builder().byAnnotation(ConfigEntry.Color.class).transforms(ColorEntry::new),
-            Transformation.builder().byType(TextColor.class).transforms(origin -> new ColorEntry<>(origin, false))
-    );
+    private static final List<Transformation> transformations = Lists.newArrayList(Transformation.DEFAULTS);
 
     static void register(Config config) {
         if (!configs.add(config)) {

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

@@ -14,7 +14,7 @@ import me.lortseam.completeconfig.data.structure.Identifiable;
 import me.lortseam.completeconfig.data.transform.Transformation;
 import me.lortseam.completeconfig.data.transform.Transformer;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
+import me.lortseam.completeconfig.extension.BaseExtension;
 import me.lortseam.completeconfig.text.TranslationKey;
 import me.lortseam.completeconfig.util.ReflectionUtils;
 import net.fabricmc.api.EnvType;
@@ -36,7 +36,7 @@ public class Entry<T> implements StructurePart, Identifiable, Translatable, Tool
     private static final Transformer DEFAULT_TRANSFORMER = Entry::new;
 
     static {
-        for (Transformation[] transformations : CompleteConfig.collectExtensions(CompleteConfigExtension.class, CompleteConfigExtension::getTransformations)) {
+        for (Transformation[] transformations : CompleteConfig.collectExtensions(BaseExtension.class, BaseExtension::getTransformations)) {
             ConfigRegistry.register(transformations);
         }
     }

+ 0 - 27
lib/src/main/java/me/lortseam/completeconfig/data/serialize/ClientSerializers.java

@@ -1,27 +0,0 @@
-package me.lortseam.completeconfig.data.serialize;
-
-import lombok.experimental.UtilityClass;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.text.TextColor;
-import org.spongepowered.configurate.serialize.CoercionFailedException;
-import org.spongepowered.configurate.serialize.ScalarSerializer;
-import org.spongepowered.configurate.serialize.TypeSerializer;
-import org.spongepowered.configurate.serialize.TypeSerializerCollection;
-
-@UtilityClass
-public final class ClientSerializers {
-
-    private static final ScalarSerializer<TextColor> TEXT_COLOR = TypeSerializer.of(TextColor.class, (v, pass) -> v.getRgb(), v -> {
-        if (v instanceof Integer) {
-            return TextColor.fromRgb((Integer) v);
-        }
-        throw new CoercionFailedException(v, TextColor.class.getSimpleName());
-    });
-
-    @Environment(EnvType.CLIENT)
-    public final static TypeSerializerCollection COLLECTION = TypeSerializerCollection.builder()
-            .registerExact(TEXT_COLOR)
-            .build();
-
-}

+ 34 - 1
lib/src/main/java/me/lortseam/completeconfig/data/transform/Transformation.java

@@ -4,7 +4,9 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.RequiredArgsConstructor;
-import me.lortseam.completeconfig.data.EntryOrigin;
+import me.lortseam.completeconfig.api.ConfigEntry;
+import me.lortseam.completeconfig.data.*;
+import me.lortseam.completeconfig.util.ReflectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
 
 import java.lang.annotation.Annotation;
@@ -25,6 +27,37 @@ public final class Transformation {
 
     private static final Set<Class<? extends Annotation>> registeredAnnotations = new HashSet<>();
 
+    public static final Transformation[] DEFAULTS = new Transformation[] {
+            Transformation.builder().byType(boolean.class, Boolean.class).byAnnotation(ConfigEntry.Boolean.class, true).transforms(BooleanEntry::new),
+            Transformation.builder().byType(int.class, Integer.class).byAnnotation(ConfigEntry.BoundedInteger.class).transforms(origin -> {
+                ConfigEntry.BoundedInteger bounds = origin.getAnnotation(ConfigEntry.BoundedInteger.class);
+                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(int.class, Integer.class).byAnnotation(Arrays.asList(ConfigEntry.BoundedInteger.class, ConfigEntry.Slider.class)).transforms(origin -> {
+                ConfigEntry.BoundedInteger bounds = origin.getAnnotation(ConfigEntry.BoundedInteger.class);
+                return new SliderEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(long.class, Long.class).byAnnotation(ConfigEntry.BoundedLong.class).transforms(origin -> {
+                ConfigEntry.BoundedLong bounds = origin.getAnnotation(ConfigEntry.BoundedLong.class);
+                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(long.class, Long.class).byAnnotation(Arrays.asList(ConfigEntry.BoundedLong.class, ConfigEntry.Slider.class)).transforms(origin -> {
+                ConfigEntry.BoundedLong bounds = origin.getAnnotation(ConfigEntry.BoundedLong.class);
+                return new SliderEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(float.class, Float.class).byAnnotation(ConfigEntry.BoundedFloat.class).transforms(origin -> {
+                ConfigEntry.BoundedFloat bounds = origin.getAnnotation(ConfigEntry.BoundedFloat.class);
+                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(double.class, Double.class).byAnnotation(ConfigEntry.BoundedDouble.class).transforms(origin -> {
+                ConfigEntry.BoundedDouble bounds = origin.getAnnotation(ConfigEntry.BoundedDouble.class);
+                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+            }),
+            Transformation.builder().byType(type -> Enum.class.isAssignableFrom(ReflectionUtils.getTypeClass(type))).transforms(EnumEntry::new),
+            Transformation.builder().byType(type -> Enum.class.isAssignableFrom(ReflectionUtils.getTypeClass(type))).byAnnotation(ConfigEntry.Dropdown.class).transforms(DropdownEntry::new),
+            Transformation.builder().byAnnotation(ConfigEntry.Color.class).transforms(origin -> new ColorEntry<>(origin, origin.getAnnotation(ConfigEntry.Color.class).alphaMode()))
+    };
+
     /**
      * Creates a new transformation builder.
      *

+ 2 - 2
lib/src/main/java/me/lortseam/completeconfig/extensions/CompleteConfigExtension.java → lib/src/main/java/me/lortseam/completeconfig/extension/BaseExtension.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.extensions;
+package me.lortseam.completeconfig.extension;
 
 import me.lortseam.completeconfig.data.transform.Transformation;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
@@ -6,7 +6,7 @@ import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 /**
  * The main CompleteConfig extension type. Used for the {@code completeconfig-extension} entrypoint.
  */
-public interface CompleteConfigExtension extends Extension {
+public interface BaseExtension extends Extension {
 
     /**
      * Used to register custom type serializers for config entries.

+ 5 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/ClientExtension.java

@@ -0,0 +1,5 @@
+package me.lortseam.completeconfig.extension;
+
+public interface ClientExtension extends BaseExtension {
+
+}

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/extensions/Extension.java → lib/src/main/java/me/lortseam/completeconfig/extension/Extension.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.extensions;
+package me.lortseam.completeconfig.extension;
 
 import java.util.Set;
 

+ 5 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/ServerExtension.java

@@ -0,0 +1,5 @@
+package me.lortseam.completeconfig.extension;
+
+public interface ServerExtension extends BaseExtension {
+
+}

+ 12 - 5
lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ClothBasicMathExtension.java → lib/src/main/java/me/lortseam/completeconfig/extension/clothbasicmath/ClothBasicMathExtension.java

@@ -1,24 +1,31 @@
-package me.lortseam.completeconfig.extensions.clothbasicmath;
+package me.lortseam.completeconfig.extension.clothbasicmath;
 
 import com.google.common.collect.ImmutableSet;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import me.lortseam.completeconfig.data.ColorEntry;
 import me.lortseam.completeconfig.data.transform.Transformation;
-import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
-import me.lortseam.completeconfig.extensions.Extension;
+import me.lortseam.completeconfig.extension.BaseExtension;
+import me.lortseam.completeconfig.extension.Extension;
 import me.shedaniel.math.Color;
+import org.spongepowered.configurate.serialize.CoercionFailedException;
+import org.spongepowered.configurate.serialize.TypeSerializer;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
 import java.util.Set;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ClothBasicMathExtension implements CompleteConfigExtension {
+public final class ClothBasicMathExtension implements BaseExtension {
 
     @Override
     public TypeSerializerCollection getTypeSerializers() {
         return TypeSerializerCollection.builder()
-                .registerExact(ColorSerializer.INSTANCE)
+                .registerExact(TypeSerializer.of(Color.class, (v, pass) -> v.getColor(), v -> {
+                    if (v instanceof Integer) {
+                        return Color.ofTransparent((Integer) v);
+                    }
+                    throw new CoercionFailedException(v, Color.class.getSimpleName());
+                }))
                 .build();
     }
 

+ 2 - 2
lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ClothBasicMathGuiExtension.java → lib/src/main/java/me/lortseam/completeconfig/extension/clothbasicmath/ClothBasicMathGuiExtension.java

@@ -1,7 +1,7 @@
-package me.lortseam.completeconfig.extensions.clothbasicmath;
+package me.lortseam.completeconfig.extension.clothbasicmath;
 
 import me.lortseam.completeconfig.data.ColorEntry;
-import me.lortseam.completeconfig.extensions.GuiExtension;
+import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
 import me.lortseam.completeconfig.gui.cloth.GuiProvider;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.math.Color;

+ 2 - 1
lib/src/main/java/me/lortseam/completeconfig/extensions/GuiExtension.java → lib/src/main/java/me/lortseam/completeconfig/extension/clothconfig/GuiExtension.java

@@ -1,5 +1,6 @@
-package me.lortseam.completeconfig.extensions;
+package me.lortseam.completeconfig.extension.clothconfig;
 
+import me.lortseam.completeconfig.extension.Extension;
 import me.lortseam.completeconfig.gui.cloth.GuiProvider;
 
 /**

+ 35 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/minecraft/MinecraftClientExtension.java

@@ -0,0 +1,35 @@
+package me.lortseam.completeconfig.extension.minecraft;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import me.lortseam.completeconfig.data.ColorEntry;
+import me.lortseam.completeconfig.data.transform.Transformation;
+import me.lortseam.completeconfig.extension.ClientExtension;
+import net.minecraft.text.TextColor;
+import org.spongepowered.configurate.serialize.CoercionFailedException;
+import org.spongepowered.configurate.serialize.TypeSerializer;
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class MinecraftClientExtension implements ClientExtension {
+
+    @Override
+    public TypeSerializerCollection getTypeSerializers() {
+        return TypeSerializerCollection.builder()
+                .registerExact(TypeSerializer.of(TextColor.class, (v, pass) -> v.getRgb(), v -> {
+                    if (v instanceof Integer) {
+                        return TextColor.fromRgb((Integer) v);
+                    }
+                    throw new CoercionFailedException(v, TextColor.class.getSimpleName());
+                }))
+                .build();
+    }
+
+    @Override
+    public Transformation[] getTransformations() {
+        return new Transformation[] {
+                Transformation.builder().byType(TextColor.class).transforms(origin -> new ColorEntry<>(origin, false))
+        };
+    }
+
+}

+ 0 - 32
lib/src/main/java/me/lortseam/completeconfig/extensions/clothbasicmath/ColorSerializer.java

@@ -1,32 +0,0 @@
-package me.lortseam.completeconfig.extensions.clothbasicmath;
-
-import me.shedaniel.math.Color;
-import org.spongepowered.configurate.serialize.CoercionFailedException;
-import org.spongepowered.configurate.serialize.ScalarSerializer;
-import org.spongepowered.configurate.serialize.SerializationException;
-
-import java.lang.reflect.Type;
-import java.util.function.Predicate;
-
-final class ColorSerializer extends ScalarSerializer<Color> {
-
-    static final ColorSerializer INSTANCE = new ColorSerializer();
-
-    private ColorSerializer() {
-        super(Color.class);
-    }
-
-    @Override
-    public Color deserialize(Type type, Object obj) throws SerializationException {
-        if (obj instanceof Integer) {
-            return Color.ofTransparent((Integer) obj);
-        }
-        throw new CoercionFailedException(type, obj, Color.class.getSimpleName());
-    }
-
-    @Override
-    protected Object serialize(Color item, Predicate<Class<?>> typeSupported) {
-        return item.getColor();
-    }
-
-}

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderRegistry.java

@@ -5,7 +5,7 @@ import com.google.common.collect.MoreCollectors;
 import com.google.common.reflect.TypeToken;
 import me.lortseam.completeconfig.CompleteConfig;
 import me.lortseam.completeconfig.data.*;
-import me.lortseam.completeconfig.extensions.GuiExtension;
+import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
 import net.fabricmc.api.EnvType;