From 1e43365bbfece0518a9eb0731113bd7d0bf420df Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Jun 2021 00:54:26 -0700 Subject: [PATCH] implement PackMetaContext --- .../terra/api/config/meta/MetaContext.java | 14 ++---- .../loaders/meta/GenericMetaValueLoader.java | 5 +- .../config/pack/meta/PackMetaContext.java | 47 +++++++++++++++++++ 3 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java diff --git a/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java b/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java index 4535c3f09..998096989 100644 --- a/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java +++ b/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java @@ -1,18 +1,10 @@ package com.dfsek.terra.api.config.meta; +import com.dfsek.tectonic.exception.ConfigException; + /** * Context from which to pull {@link MetaValue}s */ public interface MetaContext { - T load(Object in, Class clazz); - - /** - * Load method for when class is unknown. - * - * @param in Object to load/load metavalue for - * @return Loaded object - */ - default Object load(Object in) { - return load(in, in.getClass()); - } + T load(String meta, Class clazz) throws ConfigException; } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java index 8c24df782..459f87ed5 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java @@ -8,8 +8,6 @@ import com.dfsek.terra.api.util.collections.ProbabilityCollection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; public class GenericMetaValueLoader extends MetaValueLoader, Object> { protected GenericMetaValueLoader(MetaContext context) { @@ -24,8 +22,7 @@ public class GenericMetaValueLoader extends MetaValueLoader, O ParameterizedType pType = (ParameterizedType) type; Type generic = pType.getActualTypeArguments()[0]; if(c instanceof String) { - String possibleMeta = ((String) c).trim(); - // TODO: parse meta string + } return MetaValue.of(loader.loadType(generic, c)); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java b/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java new file mode 100644 index 000000000..456fb92d1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.config.pack.meta; + +import com.dfsek.tectonic.config.Configuration; +import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.terra.api.config.meta.MetaContext; +import com.dfsek.terra.config.fileloaders.Loader; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class PackMetaContext implements MetaContext { + private final Map configs = new HashMap<>(); // Lazy init configs + private final Loader fileAccess; + private final ConfigLoader loader; + + public PackMetaContext(Loader fileAccess, ConfigLoader loader) { + this.fileAccess = fileAccess; + this.loader = loader; + } + + @Override + public T load(String meta, Class clazz) throws ConfigException { + if(meta.indexOf(":") != meta.lastIndexOf(":")) { // We just need to know if there are >1. + throw new LoadException("Malformed metavalue string: " + meta); + } + + String file = "/pack.yml"; + String key; + if(meta.contains(":")) { + file = meta.substring(0, meta.indexOf(":")); + key = meta.substring(meta.indexOf(":") + 1); + } else { + key = meta; + } + Configuration configuration; + try { + configuration = new Configuration(fileAccess.get(file), file); + } catch(IOException e) { + throw new LoadException("Failed to load config file \"" + file + "\":", e); + } + + return loader.loadClass(clazz, configuration.get(key)); + } +}