mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
create MetaValuePreprocessor
This commit is contained in:
parent
c71445d3e5
commit
fe60e12f16
@ -23,6 +23,6 @@ public class YamlAddon extends TerraAddon implements EventListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void loadYamlConfigs(ConfigurationDiscoveryEvent event) {
|
public void loadYamlConfigs(ConfigurationDiscoveryEvent event) {
|
||||||
event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> event.register(new YamlConfiguration(entry.getValue(), entry.getKey()))));
|
event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey()))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,8 @@ group = "com.dfsek.terra.common"
|
|||||||
dependencies {
|
dependencies {
|
||||||
"shadedApi"("com.dfsek:Paralithic:0.4.0")
|
"shadedApi"("com.dfsek:Paralithic:0.4.0")
|
||||||
|
|
||||||
"shadedApi"("com.dfsek.tectonic:common:2.1.1")
|
"shadedApi"("com.dfsek.tectonic:common:2.1.2")
|
||||||
"shadedApi"("com.dfsek.tectonic:yaml:2.1.1")
|
"shadedApi"("com.dfsek.tectonic:yaml:2.1.2")
|
||||||
|
|
||||||
"shadedApi"("net.jafama:jafama:2.3.2")
|
"shadedApi"("net.jafama:jafama:2.3.2")
|
||||||
"shadedApi"("org.yaml:snakeyaml:1.27")
|
"shadedApi"("org.yaml:snakeyaml:1.27")
|
||||||
|
@ -5,6 +5,7 @@ import com.dfsek.terra.api.config.ConfigPack;
|
|||||||
import com.dfsek.terra.api.config.Loader;
|
import com.dfsek.terra.api.config.Loader;
|
||||||
import com.dfsek.terra.api.event.events.PackEvent;
|
import com.dfsek.terra.api.event.events.PackEvent;
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -17,9 +18,9 @@ public class ConfigurationDiscoveryEvent implements PackEvent {
|
|||||||
private final ConfigPack pack;
|
private final ConfigPack pack;
|
||||||
private final Loader loader;
|
private final Loader loader;
|
||||||
|
|
||||||
private final Consumer<Configuration> consumer;
|
private final BiConsumer<String, Configuration> consumer;
|
||||||
|
|
||||||
public ConfigurationDiscoveryEvent(ConfigPack pack, Loader loader, Consumer<Configuration> consumer) {
|
public ConfigurationDiscoveryEvent(ConfigPack pack, Loader loader, BiConsumer<String, Configuration> consumer) {
|
||||||
this.pack = pack;
|
this.pack = pack;
|
||||||
this.loader = loader;
|
this.loader = loader;
|
||||||
this.consumer = consumer;
|
this.consumer = consumer;
|
||||||
@ -34,7 +35,7 @@ public class ConfigurationDiscoveryEvent implements PackEvent {
|
|||||||
return loader;
|
return loader;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void register(Configuration config) {
|
public void register(String identifier, Configuration config) {
|
||||||
consumer.accept(config);
|
consumer.accept(identifier, config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import com.dfsek.terra.api.config.ConfigFactory;
|
|||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.config.ConfigType;
|
import com.dfsek.terra.api.config.ConfigType;
|
||||||
import com.dfsek.terra.api.config.Loader;
|
import com.dfsek.terra.api.config.Loader;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent;
|
import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
|
||||||
@ -40,6 +41,7 @@ import com.dfsek.terra.config.fileloaders.FolderLoader;
|
|||||||
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
||||||
import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader;
|
import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader;
|
||||||
import com.dfsek.terra.config.loaders.config.BufferedImageLoader;
|
import com.dfsek.terra.config.loaders.config.BufferedImageLoader;
|
||||||
|
import com.dfsek.terra.config.preprocessor.MetaValuePreprocessor;
|
||||||
import com.dfsek.terra.config.prototype.ProtoConfig;
|
import com.dfsek.terra.config.prototype.ProtoConfig;
|
||||||
import com.dfsek.terra.registry.CheckedRegistryImpl;
|
import com.dfsek.terra.registry.CheckedRegistryImpl;
|
||||||
import com.dfsek.terra.registry.OpenRegistryImpl;
|
import com.dfsek.terra.registry.OpenRegistryImpl;
|
||||||
@ -234,13 +236,16 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
varScope.create(var.getKey(), var.getValue());
|
varScope.create(var.getKey(), var.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Configuration> configurations = new ArrayList<>();
|
Map<String, Configuration> configurations = new HashMap<>();
|
||||||
|
|
||||||
main.getEventManager().callEvent(new ConfigurationDiscoveryEvent(this, loader, configurations::add)); // Create all the configs.
|
main.getEventManager().callEvent(new ConfigurationDiscoveryEvent(this, loader, configurations::put)); // Create all the configs.
|
||||||
|
|
||||||
|
selfLoader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurations));
|
||||||
|
abstractConfigLoader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurations));
|
||||||
|
|
||||||
Map<ConfigType<? extends ConfigTemplate, ?>, List<Configuration>> configs = new HashMap<>();
|
Map<ConfigType<? extends ConfigTemplate, ?>, List<Configuration>> configs = new HashMap<>();
|
||||||
|
|
||||||
for(Configuration configuration : configurations) { // Sort the configs
|
for(Configuration configuration : configurations.values()) { // Sort the configs
|
||||||
ProtoConfig config = new ProtoConfig();
|
ProtoConfig config = new ProtoConfig();
|
||||||
selfLoader.load(config, configuration);
|
selfLoader.load(config, configuration);
|
||||||
configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration);
|
configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration);
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
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.tectonic.preprocessor.ValuePreprocessor;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.lang.reflect.AnnotatedType;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class MetaValuePreprocessor implements ValuePreprocessor<Meta> {
|
||||||
|
private final Map<String, Configuration> configs;
|
||||||
|
|
||||||
|
public MetaValuePreprocessor(Map<String, Configuration> configs) {
|
||||||
|
this.configs = configs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public @NotNull <T> Result<T> process(AnnotatedType t, T c, ConfigLoader configLoader, Meta annotation) {
|
||||||
|
if(c instanceof String) {
|
||||||
|
String value = ((String) c).trim();
|
||||||
|
if(value.startsWith("$")) { // it's a meta value.
|
||||||
|
String raw = value.substring(1);
|
||||||
|
int sep = raw.indexOf(':');
|
||||||
|
String file = raw.substring(0, sep);
|
||||||
|
String key = raw.substring(sep + 1);
|
||||||
|
|
||||||
|
if(!configs.containsKey(file)) throw new LoadException("Cannot fetch metavalue: No such config: " + file);
|
||||||
|
|
||||||
|
Configuration config = configs.get(file);
|
||||||
|
|
||||||
|
if(!config.contains(key))
|
||||||
|
throw new LoadException("Cannot fetch metavalue: No such key " + key + " in configuration " + config.getName());
|
||||||
|
|
||||||
|
return (Result<T>) Result.overwrite(config.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.noOp();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user