Bläddra i källkod

Improve data parts

Lortseam 4 år sedan
förälder
incheckning
162c92602b

+ 11 - 8
src/main/java/me/lortseam/completeconfig/data/Collection.java

@@ -4,6 +4,7 @@ import lombok.Getter;
 import me.lortseam.completeconfig.api.ConfigEntryContainer;
 import me.lortseam.completeconfig.api.ConfigGroup;
 import me.lortseam.completeconfig.data.gui.TranslationIdentifier;
+import me.lortseam.completeconfig.data.part.FlatParentDataPart;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import net.minecraft.text.Text;
 import org.spongepowered.configurate.CommentedConfigurationNode;
@@ -14,7 +15,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class Collection implements DataPart<ConfigEntryContainer> {
+public class Collection implements FlatParentDataPart<ConfigMap<?>> {
 
     private final TranslationIdentifier translation;
     @Getter
@@ -32,7 +33,6 @@ public class Collection implements DataPart<ConfigEntryContainer> {
         return translation.translate();
     }
 
-    @Override
     public void resolve(ConfigEntryContainer container) {
         entries.resolve(container);
         List<ConfigEntryContainer> containers = new ArrayList<>();
@@ -73,15 +73,18 @@ public class Collection implements DataPart<ConfigEntryContainer> {
     }
 
     @Override
-    public void apply(CommentedConfigurationNode node) {
-        entries.apply(node);
-        collections.apply(node);
+    public Iterable<ConfigMap<?>> getChildren() {
+        return Arrays.asList(entries, collections);
+    }
+
+    @Override
+    public CommentedConfigurationNode navigateToChild(CommentedConfigurationNode node, ConfigMap<?> childValue) {
+        return null;
     }
 
     @Override
-    public void fetch(CommentedConfigurationNode node) {
-        entries.fetch(node);
-        collections.fetch(node);
+    public ConfigMap<?> retrieveChildValue(ConfigMap<?> childValue) {
+        return null;
     }
 
 }

+ 1 - 17
src/main/java/me/lortseam/completeconfig/data/CollectionMap.java

@@ -4,9 +4,8 @@ import me.lortseam.completeconfig.api.ConfigGroup;
 import me.lortseam.completeconfig.data.gui.TranslationIdentifier;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.spongepowered.configurate.CommentedConfigurationNode;
 
-public class CollectionMap extends ConfigMap<Collection> implements DataPart<ConfigGroup> {
+public class CollectionMap extends ConfigMap<Collection> {
 
     private static final Logger LOGGER = LogManager.getLogger();
 
@@ -14,7 +13,6 @@ public class CollectionMap extends ConfigMap<Collection> implements DataPart<Con
         super(translation);
     }
 
-    @Override
     public void resolve(ConfigGroup group) {
         String groupID = group.getConfigGroupID();
         Collection collection = new Collection(translation.append(groupID));
@@ -26,18 +24,4 @@ public class CollectionMap extends ConfigMap<Collection> implements DataPart<Con
         putUnique(groupID, collection);
     }
 
-    @Override
-    public void apply(CommentedConfigurationNode node) {
-        forEach((id, collection) -> {
-            CommentedConfigurationNode collectionNode = node.node(id);
-            if(collectionNode.virtual()) return;
-            collection.apply(collectionNode);
-        });
-    }
-
-    @Override
-    public void fetch(CommentedConfigurationNode node) {
-        forEach((id, collection) -> collection.fetch(node.node(id)));
-    }
-
 }

+ 20 - 1
src/main/java/me/lortseam/completeconfig/data/ConfigMap.java

@@ -3,12 +3,16 @@ package me.lortseam.completeconfig.data;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import me.lortseam.completeconfig.data.gui.TranslationIdentifier;
+import me.lortseam.completeconfig.data.part.DataPart;
+import me.lortseam.completeconfig.data.part.ParentDataPart;
 import org.apache.commons.lang3.StringUtils;
+import org.spongepowered.configurate.CommentedConfigurationNode;
 
 import java.util.LinkedHashMap;
+import java.util.Map;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public abstract class ConfigMap<T> extends LinkedHashMap<String, T> {
+public abstract class ConfigMap<T extends DataPart> extends LinkedHashMap<String, T> implements ParentDataPart<Map.Entry<String, T>, T> {
 
     protected final TranslationIdentifier translation;
 
@@ -22,4 +26,19 @@ public abstract class ConfigMap<T> extends LinkedHashMap<String, T> {
         put(id, value);
     }
 
+    @Override
+    public Iterable<Map.Entry<String, T>> getChildren() {
+        return entrySet();
+    }
+
+    @Override
+    public CommentedConfigurationNode navigateToChild(CommentedConfigurationNode node, Map.Entry<String, T> stringTEntry) {
+        return node.node(stringTEntry.getKey());
+    }
+
+    @Override
+    public T retrieveChildValue(Map.Entry<String, T> stringTEntry) {
+        return stringTEntry.getValue();
+    }
+
 }

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

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.api.ConfigEntryContainer;
 import me.lortseam.completeconfig.data.gui.TranslationIdentifier;
+import me.lortseam.completeconfig.data.part.DataPart;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import net.minecraft.text.Text;
@@ -21,7 +22,7 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Consumer;
 
-public class Entry<T> implements EntryAccessor<T>, DataPart<Field> {
+public class Entry<T> implements EntryAccessor<T>, DataPart {
 
     private static final Logger LOGGER = LogManager.getLogger();
     private static final Map<Field, EntryAccessor> ENTRIES = new HashMap<>();
@@ -167,7 +168,6 @@ public class Entry<T> implements EntryAccessor<T>, DataPart<Field> {
         modifier.accept(this);
     }
 
-    @Override
     public void resolve(Field field) {
         if (field.isAnnotationPresent(ConfigEntry.class)) {
             ConfigEntry annotation = field.getDeclaredAnnotation(ConfigEntry.class);

+ 1 - 17
src/main/java/me/lortseam/completeconfig/data/EntryMap.java

@@ -8,20 +8,18 @@ import me.lortseam.completeconfig.data.gui.TranslationIdentifier;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import me.lortseam.completeconfig.exception.IllegalModifierException;
 import me.lortseam.completeconfig.exception.IllegalReturnTypeException;
-import org.spongepowered.configurate.CommentedConfigurationNode;
 
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-public class EntryMap extends ConfigMap<Entry> implements DataPart<ConfigEntryContainer> {
+public class EntryMap extends ConfigMap<Entry> {
 
     EntryMap(TranslationIdentifier translation) {
         super(translation);
     }
 
-    @Override
     public void resolve(ConfigEntryContainer container) {
         List<Entry> containerEntries = new ArrayList<>();
         for (Class<? extends ConfigEntryContainer> clazz : container.getConfigClasses()) {
@@ -80,18 +78,4 @@ public class EntryMap extends ConfigMap<Entry> implements DataPart<ConfigEntryCo
         }
     }
 
-    @Override
-    public void apply(CommentedConfigurationNode node) {
-        forEach((id, entry) -> {
-            CommentedConfigurationNode entryNode = node.node(id);
-            if(entryNode.virtual()) return;
-            entry.apply(entryNode);
-        });
-    }
-
-    @Override
-    public void fetch(CommentedConfigurationNode node) {
-        forEach((id, entry) -> entry.fetch(node.node(id)));
-    }
-
 }

+ 2 - 4
src/main/java/me/lortseam/completeconfig/data/DataPart.java → src/main/java/me/lortseam/completeconfig/data/part/DataPart.java

@@ -1,10 +1,8 @@
-package me.lortseam.completeconfig.data;
+package me.lortseam.completeconfig.data.part;
 
 import org.spongepowered.configurate.CommentedConfigurationNode;
 
-interface DataPart<T> {
-
-    void resolve(T t);
+public interface DataPart {
 
     void apply(CommentedConfigurationNode node);
 

+ 17 - 0
src/main/java/me/lortseam/completeconfig/data/part/FlatParentDataPart.java

@@ -0,0 +1,17 @@
+package me.lortseam.completeconfig.data.part;
+
+import org.spongepowered.configurate.CommentedConfigurationNode;
+
+public interface FlatParentDataPart<CV extends DataPart> extends ParentDataPart<CV, CV> {
+
+    @Override
+    default CommentedConfigurationNode navigateToChild(CommentedConfigurationNode node, CV childValue) {
+        return node;
+    }
+
+    @Override
+    default CV retrieveChildValue(CV childValue) {
+        return childValue;
+    }
+
+}

+ 41 - 0
src/main/java/me/lortseam/completeconfig/data/part/ParentDataPart.java

@@ -0,0 +1,41 @@
+package me.lortseam.completeconfig.data.part;
+
+import org.spongepowered.configurate.CommentedConfigurationNode;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+public interface ParentDataPart<C, CV extends DataPart> extends DataPart {
+
+    Iterable<C> getChildren();
+
+    CommentedConfigurationNode navigateToChild(CommentedConfigurationNode node, C c);
+
+    CV retrieveChildValue(C c);
+
+    @Override
+    default void apply(CommentedConfigurationNode node) {
+        propagateToChildren(childNode -> !childNode.virtual(), child -> child::apply, node);
+    }
+
+    @Override
+    default void fetch(CommentedConfigurationNode node) {
+        propagateToChildren(child -> child::fetch, node);
+    }
+
+    default void propagateToChildren(Predicate<CommentedConfigurationNode> childNodeCondition, Function<CV, Consumer<CommentedConfigurationNode>> functionSupplier, CommentedConfigurationNode node) {
+        for (C child : getChildren()) {
+            CommentedConfigurationNode childNode = navigateToChild(node, child);
+            if (!childNodeCondition.test(childNode)) {
+                continue;
+            }
+            functionSupplier.apply(retrieveChildValue(child)).accept(childNode);
+        }
+    }
+
+    default void propagateToChildren(Function<CV, Consumer<CommentedConfigurationNode>> functionSupplier, CommentedConfigurationNode node) {
+        propagateToChildren((childNode) -> true, functionSupplier, node);
+    }
+
+}