diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java index 54c1f2adc..ec3ae73f5 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java @@ -12,10 +12,11 @@ import com.dfsek.terra.api.util.reflection.TypeKey; import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; +import java.util.Arrays; import java.util.Map; public class MetaNumberPreprocessor extends MetaPreprocessor { - public static final TypeKey<@Meta String> META_STRING_KEY = new TypeKey<>() {}; + public static final TypeKey META_STRING_KEY = new TypeKey<@Meta String>() {}; public MetaNumberPreprocessor(Map configs) { super(configs); diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java index d26721c36..c941b8649 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java @@ -24,10 +24,10 @@ public class MetaStringPreprocessor extends MetaPreprocessor { String candidate = (String) c; StringSubstitutor substitutor = new StringSubstitutor(key -> { Object meta = getMetaValue(key); - if(!(meta instanceof String)) { - throw new LoadException("MetaString template injection candidate must be string, is type " + meta.getClass().getCanonicalName()); + if(!(meta instanceof String) && !(meta instanceof Number) && !(meta instanceof Character) && !(meta instanceof Boolean)) { + throw new LoadException("MetaString template injection candidate must be string or primitive, is type " + meta.getClass().getCanonicalName()); } - return (String) meta; + return meta.toString(); }); return (Result) Result.overwrite(substitutor.replace(candidate)); } diff --git a/common/implementation/src/test/java/MetaTest.java b/common/implementation/src/test/java/MetaTest.java index 84ca5443d..6d48edaed 100644 --- a/common/implementation/src/test/java/MetaTest.java +++ b/common/implementation/src/test/java/MetaTest.java @@ -6,6 +6,7 @@ import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.config.preprocessor.MetaListLikePreprocessor; import com.dfsek.terra.config.preprocessor.MetaMapPreprocessor; +import com.dfsek.terra.config.preprocessor.MetaNumberPreprocessor; import com.dfsek.terra.config.preprocessor.MetaStringPreprocessor; import com.dfsek.terra.config.preprocessor.MetaValuePreprocessor; import org.junit.jupiter.api.Test; @@ -26,9 +27,12 @@ public class MetaTest { configurationMap.put(metaTarget.getName(), metaTarget); ConfigLoader loader = new ConfigLoader(); - loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + + loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); loader.load(new MetaListConfig(), meta).list.forEach(System.out::println); } @@ -49,9 +53,12 @@ public class MetaTest { configurationMap.put(metaTarget.getName(), metaTarget); ConfigLoader loader = new ConfigLoader(); - loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + + loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); loader.load(new MetaMapConfig(), meta).map.forEach((k, v) -> System.out.println(k + ": " + v)); } @@ -72,10 +79,13 @@ public class MetaTest { configurationMap.put(metaTarget.getName(), metaTarget); ConfigLoader loader = new ConfigLoader(); - loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); + + loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); - loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + + loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); System.out.println(loader.load(new MetaStringConfig(), meta).string); } @@ -84,4 +94,34 @@ public class MetaTest { @Value("string") private @Meta String string; } + + @Test + public void testMetaNumber() { + Configuration meta = new YamlConfiguration(MetaTest.class.getResourceAsStream("/meta.yml"), "meta.yml"); + Configuration metaTarget = new YamlConfiguration(MetaTest.class.getResourceAsStream("/metaTarget.yml"), "metaTarget.yml"); + + Map configurationMap = new HashMap<>(); + + configurationMap.put(meta.getName(), meta); + configurationMap.put(metaTarget.getName(), metaTarget); + + ConfigLoader loader = new ConfigLoader(); + loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + + loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); + + System.out.println("int: " + loader.load(new MetaNumberConfig(), meta).integer); + System.out.println("double: " + loader.load(new MetaNumberConfig(), meta).aDouble); + } + + private static final class MetaNumberConfig implements ConfigTemplate { + @Value("int") + private @Meta int integer; + + @Value("double") + private @Meta double aDouble; + } } diff --git a/common/implementation/src/test/resources/meta.yml b/common/implementation/src/test/resources/meta.yml index 8a629da42..116b32b89 100644 --- a/common/implementation/src/test/resources/meta.yml +++ b/common/implementation/src/test/resources/meta.yml @@ -13,4 +13,6 @@ map: - metaTarget.yml:map2 one: ONE two: TWO -string: "one-${metaTarget.yml:string.two}-${metaTarget.yml:string.three}-four-five-${metaTarget.yml:string.six}" \ No newline at end of file +string: "one-${metaTarget.yml:string.two}-${metaTarget.yml:string.three}-four-five-${metaTarget.yml:string.six}" +int: 2 + 4 +double: ${metaTarget.yml:double} + 5.6 \ No newline at end of file diff --git a/common/implementation/src/test/resources/metaTarget.yml b/common/implementation/src/test/resources/metaTarget.yml index 74429a5c3..338930b52 100644 --- a/common/implementation/src/test/resources/metaTarget.yml +++ b/common/implementation/src/test/resources/metaTarget.yml @@ -13,4 +13,5 @@ map2: string: two: two three: three - six: six \ No newline at end of file + six: six +double: 1 \ No newline at end of file