Generify shortcut configs to work on any type

This commit is contained in:
dfsek
2025-12-30 00:23:44 -07:00
parent 2ad05cbbb6
commit efa4bf5bb4

View File

@@ -26,7 +26,11 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.tectonic.api.loader.AbstractConfigLoader; import com.dfsek.tectonic.api.loader.AbstractConfigLoader;
import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.ConfigLoader;
import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader;
import com.dfsek.tectonic.impl.loading.object.ObjectTemplateLoader;
import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.tectonic.yaml.YamlConfiguration;
import com.dfsek.terra.api.tectonic.ConfigLoadingDelegate;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps; import com.google.common.collect.Multimaps;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -47,9 +51,11 @@ import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.ServiceLoader.Provider;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -99,6 +105,7 @@ public class ConfigPackImpl implements ConfigPack {
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
private final ConfigLoader selfLoader = new ConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader();
private final Map<Type, TypeLoader<?>> loaders = new HashMap<>();
private final Platform platform; private final Platform platform;
private final Path rootPath; private final Path rootPath;
@@ -107,7 +114,7 @@ public class ConfigPackImpl implements ConfigPack {
private final BiomeProvider seededBiomeProvider; private final BiomeProvider seededBiomeProvider;
private final Map<Type, CheckedRegistryImpl<?>> registryMap = new HashMap<>(); private final Map<Type, CheckedRegistryImpl<?>> registryMap = new HashMap<>();
private final Map<Type, ShortcutHolder<?>> shortcuts = new HashMap<>(); private final Map<Type, Supplier<ShortcutHolder<?>>> shortcuts = new HashMap<>();
private final OpenRegistry<ConfigType<?, ?>> configTypeRegistry; private final OpenRegistry<ConfigType<?, ?>> configTypeRegistry;
private final TreeMap<Integer, List<Pair<RegistryKey, ConfigType<?, ?>>>> configTypes = new TreeMap<>(); private final TreeMap<Integer, List<Pair<RegistryKey, ConfigType<?, ?>>>> configTypes = new TreeMap<>();
@@ -142,10 +149,7 @@ public class ConfigPackImpl implements ConfigPack {
this.platform = platform; this.platform = platform;
this.configTypeRegistry = createConfigRegistry(); this.configTypeRegistry = createConfigRegistry();
register(selfLoader);
platform.register(selfLoader); platform.register(selfLoader);
register(abstractConfigLoader);
platform.register(abstractConfigLoader); platform.register(abstractConfigLoader);
ConfigPackAddonsTemplate addonsTemplate = new ConfigPackAddonsTemplate(); ConfigPackAddonsTemplate addonsTemplate = new ConfigPackAddonsTemplate();
@@ -163,6 +167,9 @@ public class ConfigPackImpl implements ConfigPack {
platform.getEventManager().callEvent( platform.getEventManager().callEvent(
new ConfigPackPreLoadEvent(this, template -> selfLoader.load(template, packManifest))); new ConfigPackPreLoadEvent(this, template -> selfLoader.load(template, packManifest)));
register(selfLoader);
register(abstractConfigLoader);
selfLoader.load(template, packManifest); selfLoader.load(template, packManifest);
String namespace; String namespace;
@@ -259,6 +266,7 @@ public class ConfigPackImpl implements ConfigPack {
public <T> ConfigPackImpl applyLoader(Type type, TypeLoader<T> loader) { public <T> ConfigPackImpl applyLoader(Type type, TypeLoader<T> loader) {
abstractConfigLoader.registerLoader(type, loader); abstractConfigLoader.registerLoader(type, loader);
selfLoader.registerLoader(type, loader); selfLoader.registerLoader(type, loader);
loaders.put(type, loader);
return this; return this;
} }
@@ -266,6 +274,7 @@ public class ConfigPackImpl implements ConfigPack {
public <T> ConfigPackImpl applyLoader(Type type, Supplier<ObjectTemplate<T>> loader) { public <T> ConfigPackImpl applyLoader(Type type, Supplier<ObjectTemplate<T>> loader) {
abstractConfigLoader.registerLoader(type, loader); abstractConfigLoader.registerLoader(type, loader);
selfLoader.registerLoader(type, loader); selfLoader.registerLoader(type, loader);
loaders.put(type, new ObjectTemplateLoader<>(loader));
return this; return this;
} }
@@ -273,7 +282,7 @@ public class ConfigPackImpl implements ConfigPack {
public void register(TypeRegistry registry) { public void register(TypeRegistry registry) {
registry.registerLoader(ConfigType.class, configTypeRegistry); registry.registerLoader(ConfigType.class, configTypeRegistry);
registryMap.forEach(registry::registerLoader); registryMap.forEach(registry::registerLoader);
shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present shortcuts.forEach((k, v) -> registry.registerLoader(k, v.get())); // overwrite with delegated shortcuts if present
} }
@Override @Override
@@ -357,11 +366,9 @@ public class ConfigPackImpl implements ConfigPack {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@Override @Override
public <T> ConfigPack registerShortcut(TypeKey<T> clazz, String shortcut, ShortcutLoader<T> loader) { public <T> ConfigPack registerShortcut(TypeKey<T> clazz, String shortcut, ShortcutLoader<T> loader) {
ShortcutHolder<?> holder = shortcuts shortcuts.put(clazz.getType(),
.computeIfAbsent(clazz.getType(), c -> new ShortcutHolder<>(getOrCreateRegistry(clazz))) () -> new ShortcutHolder<>(loaders.computeIfAbsent(clazz.getType(), t -> getOrCreateRegistry(clazz))).register(shortcut,
.register(shortcut, (ShortcutLoader) loader); (ShortcutLoader) loader));
selfLoader.registerLoader(clazz.getType(), holder);
abstractConfigLoader.registerLoader(clazz.getType(), holder);
return this; return this;
} }