From 10a06157aac38cfa72ca917f95d50ede8c72102e Mon Sep 17 00:00:00 2001 From: tterrag Date: Fri, 22 Mar 2019 23:38:43 -0400 Subject: [PATCH] Update Night-Config to 3.5.0, improve defineEnum methods Closes #5537 --- build.gradle | 4 +- .../common/ForgeConfigSpec.java | 113 ++++++++++++++---- 2 files changed, 91 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 812681ade1..67827c0923 100644 --- a/build.gradle +++ b/build.gradle @@ -294,8 +294,8 @@ project(':forge') { installer 'net.minecraftforge:forgespi:0.11.+' installer 'net.minecraftforge:coremods:0.4.+' installer 'net.minecraftforge:unsafe:0.2.+' - installer 'com.electronwill.night-config:core:3.4.2' - installer 'com.electronwill.night-config:toml:3.4.2' + installer 'com.electronwill.night-config:core:3.5.0' + installer 'com.electronwill.night-config:toml:3.5.0' installer 'org.jline:jline:3.9.0' installer 'org.apache.maven:maven-artifact:3.6.0' installer 'net.jodah:typetools:0.6.0' diff --git a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java index f43430b806..ddafe1aaa2 100644 --- a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java +++ b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java @@ -24,7 +24,6 @@ import static com.electronwill.nightconfig.core.ConfigSpec.CorrectionAction.REMO import static com.electronwill.nightconfig.core.ConfigSpec.CorrectionAction.REPLACE; import static net.minecraftforge.fml.Logging.CORE; -import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -33,10 +32,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Objects; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -46,20 +43,17 @@ import org.apache.logging.log4j.LogManager; import com.electronwill.nightconfig.core.CommentedConfig; import com.electronwill.nightconfig.core.Config; -import com.electronwill.nightconfig.core.InMemoryFormat; -import com.electronwill.nightconfig.core.utils.UnmodifiableConfigWrapper; +import com.electronwill.nightconfig.core.EnumGetMethod; import com.electronwill.nightconfig.core.ConfigSpec.CorrectionAction; import com.electronwill.nightconfig.core.ConfigSpec.CorrectionListener; -import com.electronwill.nightconfig.core.file.CommentedFileConfig; +import com.electronwill.nightconfig.core.InMemoryFormat; import com.electronwill.nightconfig.core.file.FileConfig; -import com.electronwill.nightconfig.core.io.WritingMode; +import com.electronwill.nightconfig.core.utils.UnmodifiableConfigWrapper; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Lists; -import io.netty.util.BooleanSupplier; - /* * Like {@link com.electronwill.nightconfig.core.ConfigSpec} except in builder format, and extended to acept comments, language keys, * and other things Forge configs would find useful. @@ -296,37 +290,84 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper } //Enum - public > ConfigValue defineEnum(String path, V defaultValue) { + public > EnumValue defineEnum(String path, V defaultValue) { return defineEnum(split(path), defaultValue); } - public > ConfigValue defineEnum(List path, V defaultValue) { + public > EnumValue defineEnum(String path, V defaultValue, EnumGetMethod converter) { + return defineEnum(split(path), defaultValue, converter); + } + public > EnumValue defineEnum(List path, V defaultValue) { return defineEnum(path, defaultValue, defaultValue.getDeclaringClass().getEnumConstants()); } - public > ConfigValue defineEnum(String path, V defaultValue, @SuppressWarnings("unchecked") V... acceptableValues) { + public > EnumValue defineEnum(List path, V defaultValue, EnumGetMethod converter) { + return defineEnum(path, defaultValue, converter, defaultValue.getDeclaringClass().getEnumConstants()); + } + public > EnumValue defineEnum(String path, V defaultValue, @SuppressWarnings("unchecked") V... acceptableValues) { return defineEnum(split(path), defaultValue, acceptableValues); } - public > ConfigValue defineEnum(List path, V defaultValue, @SuppressWarnings("unchecked") V... acceptableValues) { - return defineEnum(path, defaultValue, Arrays.asList(acceptableValues)); + public > EnumValue defineEnum(String path, V defaultValue, EnumGetMethod converter, @SuppressWarnings("unchecked") V... acceptableValues) { + return defineEnum(split(path), defaultValue, converter, acceptableValues); } - public > ConfigValue defineEnum(String path, V defaultValue, Collection acceptableValues) { + public > EnumValue defineEnum(List path, V defaultValue, @SuppressWarnings("unchecked") V... acceptableValues) { + return defineEnum(path, defaultValue, (Collection) Arrays.asList(acceptableValues)); + } + public > EnumValue defineEnum(List path, V defaultValue, EnumGetMethod converter, @SuppressWarnings("unchecked") V... acceptableValues) { + return defineEnum(path, defaultValue, converter, Arrays.asList(acceptableValues)); + } + public > EnumValue defineEnum(String path, V defaultValue, Collection acceptableValues) { return defineEnum(split(path), defaultValue, acceptableValues); } - public > ConfigValue defineEnum(List path, V defaultValue, Collection acceptableValues) { - return defineEnum(path, defaultValue, acceptableValues::contains); + public > EnumValue defineEnum(String path, V defaultValue, EnumGetMethod converter, Collection acceptableValues) { + return defineEnum(split(path), defaultValue, converter, acceptableValues); } - public > ConfigValue defineEnum(String path, V defaultValue, Predicate validator) { + public > EnumValue defineEnum(List path, V defaultValue, Collection acceptableValues) { + return defineEnum(path, defaultValue, EnumGetMethod.NAME_IGNORECASE, acceptableValues); + } + public > EnumValue defineEnum(List path, V defaultValue, EnumGetMethod converter, Collection acceptableValues) { + return defineEnum(path, defaultValue, converter, obj -> { + if (obj instanceof Enum) { + return acceptableValues.contains(obj); + } + if (obj == null) { + return false; + } + try { + return acceptableValues.contains(converter.get(obj, defaultValue.getClass())); + } catch (IllegalArgumentException | ClassCastException e) { + return false; + } + }); + } + public > EnumValue defineEnum(String path, V defaultValue, Predicate validator) { return defineEnum(split(path), defaultValue, validator); } - public > ConfigValue defineEnum(List path, V defaultValue, Predicate validator) { + public > EnumValue defineEnum(String path, V defaultValue, EnumGetMethod converter, Predicate validator) { + return defineEnum(split(path), defaultValue, converter, validator); + } + public > EnumValue defineEnum(List path, V defaultValue, Predicate validator) { return defineEnum(path, () -> defaultValue, validator, defaultValue.getDeclaringClass()); } - public > ConfigValue defineEnum(String path, Supplier defaultSupplier, Predicate validator, Class clazz) { + public > EnumValue defineEnum(List path, V defaultValue, EnumGetMethod converter, Predicate validator) { + return defineEnum(path, () -> defaultValue, converter, validator, defaultValue.getDeclaringClass()); + } + public > EnumValue defineEnum(String path, Supplier defaultSupplier, Predicate validator, Class clazz) { return defineEnum(split(path), defaultSupplier, validator, clazz); } - public > ConfigValue defineEnum(List path, Supplier defaultSupplier, Predicate validator, Class clazz) { - return define(path, defaultSupplier, validator, clazz); + public > EnumValue defineEnum(String path, Supplier defaultSupplier, EnumGetMethod converter, Predicate validator, Class clazz) { + return defineEnum(split(path), defaultSupplier, converter, validator, clazz); + } + public > EnumValue defineEnum(List path, Supplier defaultSupplier, Predicate validator, Class clazz) { + return defineEnum(path, defaultSupplier, EnumGetMethod.NAME_IGNORECASE, validator, clazz); + } + public > EnumValue defineEnum(List path, Supplier defaultSupplier, EnumGetMethod converter, Predicate validator, Class clazz) { + context.setClazz(clazz); + return new EnumValue(this, define(path, new ValueSpec(defaultSupplier, validator, context) { + @Override + public Object correct(Object value) { + return ((Enum)super.correct(value)).name(); + } + }, defaultSupplier).getPath(), defaultSupplier, converter, clazz); } - //boolean public BooleanValue define(String path, boolean defaultValue) { @@ -593,7 +634,12 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper { Preconditions.checkNotNull(spec, "Cannot get config value before spec is built"); Preconditions.checkNotNull(spec.childConfig, "Cannot get config value without assigned Config object present"); - return spec.childConfig.getOrElse(path, defaultSupplier); + return getRaw(spec.childConfig, path, defaultSupplier); + } + + protected T getRaw(Config config, List path, Supplier defaultSupplier) + { + return config.getOrElse(path, defaultSupplier); } public Builder next() @@ -633,6 +679,25 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper super(parent, path, defaultSupplier); } } + + public static class EnumValue> extends ConfigValue + { + private final EnumGetMethod converter; + private final Class clazz; + + EnumValue(Builder parent, List path, Supplier defaultSupplier, EnumGetMethod converter, Class clazz) + { + super(parent, path, defaultSupplier); + this.converter = converter; + this.clazz = clazz; + } + + @Override + protected T getRaw(Config config, List path, Supplier defaultSupplier) + { + return config.getEnumOrElse(path, clazz, converter, defaultSupplier); + } + } private static final Joiner LINE_JOINER = Joiner.on("\n"); private static final Joiner DOT_JOINER = Joiner.on(".");