From d0434ef05e504d9265a5d3223a9b8126bff7bbc6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Jul 2021 09:48:40 -0700 Subject: [PATCH] create MetaMapPreprocessor --- .../preprocessor/MetaMapPreprocessor.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java new file mode 100644 index 000000000..a799a71ac --- /dev/null +++ b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.config.preprocessor; + +import com.dfsek.tectonic.config.Configuration; +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.preprocessor.Result; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.util.reflection.TypeKey; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; +import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MetaMapPreprocessor extends MetaPreprocessor { + public MetaMapPreprocessor(Map configs) { + super(configs); + } + + private static final TypeKey> STRING_LIST = new TypeKey<>() {}; + @SuppressWarnings("unchecked") + @Override + public @NotNull Result process(AnnotatedType t, T c, ConfigLoader loader, Meta annotation) { + if(t.getType() instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) t.getType(); + if(parameterizedType.getRawType() instanceof Class) { // Should always be true but we check anyways + Class baseClass = (Class) parameterizedType.getRawType(); + + if(Map.class.isAssignableFrom(baseClass) && c instanceof Map) { // List metaconfig + Map map = (Map) c; + + Map newMap = new HashMap<>(map); + + if(map.containsKey("<<")) { + newMap.putAll(map); + newMap.remove("<<"); // Remove placeholder + + List keys = (List) loader.loadType(STRING_LIST.getAnnotatedType(), map.get("<<")); + keys.forEach(key -> { + Object meta = getMetaValue(key); + if(!(meta instanceof Map)) { + throw new LoadException("MetaMap injection candidate must be list, is type " + meta.getClass().getCanonicalName()); + } + newMap.putAll((Map) meta); + }); + return (Result) Result.overwrite(newMap); + } + + + } + } + } + + return Result.noOp(); + } +}