Bladeren bron

Global type serializer registration

Lortseam 4 jaren geleden
bovenliggende
commit
066ac571f6

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

@@ -0,0 +1,13 @@
+package me.lortseam.completeconfig;
+
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
+
+import java.util.Objects;
+
+public final class CompleteConfig {
+
+    public static void registerGlobalTypeSerializers(TypeSerializerCollection typeSerializers) {
+        ConfigSource.registerGlobalTypeSerializers(Objects.requireNonNull(typeSerializers));
+    }
+
+}

+ 2 - 9
src/main/java/me/lortseam/completeconfig/ConfigBuilder.java

@@ -2,6 +2,7 @@ package me.lortseam.completeconfig;
 
 import me.lortseam.completeconfig.api.ConfigGroup;
 import me.lortseam.completeconfig.gui.GuiBuilder;
+import me.lortseam.completeconfig.util.TypeUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
@@ -60,15 +61,7 @@ public final class ConfigBuilder {
      * @return this config builder
      */
     public ConfigBuilder registerTypeSerializers(TypeSerializerCollection typeSerializers) {
-        Objects.requireNonNull(typeSerializers);
-        if (this.typeSerializers == null) {
-            this.typeSerializers = typeSerializers;
-        } else {
-            this.typeSerializers = TypeSerializerCollection.builder()
-                    .registerAll(this.typeSerializers)
-                    .registerAll(typeSerializers)
-                    .build();
-        }
+        this.typeSerializers = TypeUtils.mergeSerializers(this.typeSerializers, Objects.requireNonNull(typeSerializers));
         return this;
     }
 

+ 6 - 0
src/main/java/me/lortseam/completeconfig/ConfigSource.java

@@ -3,6 +3,7 @@ package me.lortseam.completeconfig;
 import lombok.AccessLevel;
 import lombok.Getter;
 import me.lortseam.completeconfig.data.Config;
+import me.lortseam.completeconfig.util.TypeUtils;
 import net.fabricmc.loader.api.FabricLoader;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.logging.log4j.LogManager;
@@ -23,6 +24,11 @@ final class ConfigSource {
 
     private static final Logger LOGGER = LogManager.getLogger();
     private static final Set<ConfigSource> SOURCES = new HashSet<>();
+    private static TypeSerializerCollection globalTypeSerializers;
+
+    static void registerGlobalTypeSerializers(TypeSerializerCollection typeSerializers) {
+        globalTypeSerializers = TypeUtils.mergeSerializers(globalTypeSerializers, typeSerializers);
+    }
 
     @Getter(AccessLevel.PACKAGE)
     private final String modID;

+ 26 - 0
src/main/java/me/lortseam/completeconfig/util/TypeUtils.java

@@ -2,12 +2,19 @@ package me.lortseam.completeconfig.util;
 
 import com.google.common.reflect.TypeToken;
 import io.leangen.geantyref.GenericTypeReflector;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Objects;
 
 public final class TypeUtils {
 
+    private static final Logger LOGGER = LogManager.getLogger();
+
     public static Type getFieldType(Field field) {
         return GenericTypeReflector.getExactFieldType(field, field.getDeclaringClass());
     }
@@ -16,4 +23,23 @@ public final class TypeUtils {
         return TypeToken.of(type).getRawType();
     }
 
+    public static TypeSerializerCollection mergeSerializers(TypeSerializerCollection... typeSerializerCollections) {
+        typeSerializerCollections = Arrays.stream(typeSerializerCollections).filter(Objects::nonNull).toArray(TypeSerializerCollection[]::new);
+        switch (typeSerializerCollections.length) {
+            case 0:
+                LOGGER.warn("Tried to merge non-existent type serializer collections!");
+                return null;
+
+            case 1:
+                return typeSerializerCollections[0];
+
+            default:
+                TypeSerializerCollection.Builder builder = TypeSerializerCollection.builder();
+                for (TypeSerializerCollection collection : typeSerializerCollections) {
+                    builder.registerAll(collection);
+                }
+                return builder.build();
+        }
+    }
+
 }