From fcbf51d80bd633ee24c24edc9ca3650fd1997945 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 16 Jul 2023 11:51:51 +1000 Subject: [PATCH] Allow Range keys to be meta annotated --- .../dfsek/terra/config/GenericLoaders.java | 2 ++ .../terra/config/loaders/RangeLoader.java | 27 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index f4f5c6cfd..67874694f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -35,6 +35,7 @@ import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; +import com.dfsek.terra.config.loaders.RangeLoader.RangeMap; import com.dfsek.terra.config.loaders.VersionLoader; import com.dfsek.terra.config.loaders.VersionRangeLoader; @@ -50,6 +51,7 @@ public class GenericLoaders implements LoaderRegistrar { public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(Range.class, new RangeLoader()) + .registerLoader(RangeMap.class, RangeLoader.RangeMapTemplate::new) // Needed to use ObjectTemplates in TypeLoaders .registerLoader(Version.class, new VersionLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java index b4e55f935..c4463bfbb 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java @@ -17,14 +17,20 @@ package com.dfsek.terra.config.loaders; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.api.config.meta.Meta; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; +import java.util.function.Supplier; import com.dfsek.terra.api.util.ConstantRange; import com.dfsek.terra.api.util.Range; @@ -36,11 +42,28 @@ public class RangeLoader implements TypeLoader { public Range load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { if(o instanceof Map) { - Map map = (Map) o; - return new ConstantRange(map.get("min"), map.get("max")); + return configLoader.loadType(RangeMap.class, o, depthTracker).get(); } else { int h = configLoader.loadType(Integer.class, o, depthTracker); return new ConstantRange(h, h + 1); } } + + public interface RangeMap extends Supplier {} + + /* + * Template needed so keys can be meta annotated, otherwise the loader could just grab keys directly from the object + */ + public static class RangeMapTemplate implements ObjectTemplate { + @Value("min") + private @Meta int min; + + @Value("max") + private @Meta int max; + + @Override + public RangeMap get() { + return () -> new ConstantRange(min, max); + } + } }