107 lines
3.8 KiB
Java
107 lines
3.8 KiB
Java
package io.gitlab.jfronny.libjf.config.impl;
|
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
import io.gitlab.jfronny.gson.Gson;
|
|
import io.gitlab.jfronny.gson.GsonBuilder;
|
|
import io.gitlab.jfronny.libjf.LibJf;
|
|
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
|
|
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
|
|
import io.gitlab.jfronny.libjf.gson.HiddenAnnotationExclusionStrategy;
|
|
import io.gitlab.jfronny.libjf.unsafe.JfLanguageAdapter;
|
|
import net.fabricmc.loader.api.FabricLoader;
|
|
import net.fabricmc.loader.api.ModContainer;
|
|
import net.fabricmc.loader.api.metadata.CustomValue;
|
|
import net.fabricmc.loader.impl.util.log.Log;
|
|
import org.jetbrains.annotations.ApiStatus;
|
|
|
|
import java.lang.reflect.Modifier;
|
|
import java.nio.file.Path;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
|
|
public class ConfigHolderImpl implements ConfigHolder {
|
|
@ApiStatus.Internal
|
|
public static final ConfigHolderImpl INSTANCE = new ConfigHolderImpl();
|
|
private ConfigHolderImpl() {
|
|
}
|
|
public static final String MODULE_ID = LibJf.MOD_ID + ":config";
|
|
public static Gson GSON = new GsonBuilder()
|
|
.excludeFieldsWithModifiers(Modifier.TRANSIENT)
|
|
.excludeFieldsWithModifiers(Modifier.PRIVATE)
|
|
.addSerializationExclusionStrategy(new HiddenAnnotationExclusionStrategy())
|
|
.setPrettyPrinting()
|
|
.create();
|
|
private final Map<String, ConfigInstance> configs = new HashMap<>();
|
|
private final Map<Path, ConfigInstance> configsByPath = new HashMap<>();
|
|
|
|
@Override
|
|
public void register(String modId, Class<?> config) {
|
|
if (isRegistered(modId)) {
|
|
if (get(modId).matchesConfigClass(config)) {
|
|
Log.warn(JfLanguageAdapter.LOG_CATEGORY, "Attempted to set config of " + modId + " twice, skipping");
|
|
return;
|
|
}
|
|
Log.warn(JfLanguageAdapter.LOG_CATEGORY, "Overriding config class of " + modId + " to " + config);
|
|
}
|
|
if (isRegistered(config)) {
|
|
Log.warn(JfLanguageAdapter.LOG_CATEGORY, "Attempted to reuse config class " + config + ", this is unsupported");
|
|
}
|
|
Optional<ModContainer> container = FabricLoader.getInstance().getModContainer(modId);
|
|
AuxiliaryMetadata meta = new AuxiliaryMetadata();
|
|
if (container.isPresent()) {
|
|
CustomValue cv = container.get().getMetadata().getCustomValue(MODULE_ID);
|
|
if (cv != null) meta = AuxiliaryMetadata.load(cv);
|
|
}
|
|
else {
|
|
Log.warn(JfLanguageAdapter.LOG_CATEGORY, "Attempted to register config for a mod that is not installed: " + modId);
|
|
}
|
|
ConfigInstanceRoot instance = new ConfigInstanceRoot(modId, config, meta.sanitize());
|
|
configs.put(modId, instance);
|
|
configsByPath.put(instance.path, instance);
|
|
}
|
|
|
|
@Override
|
|
public Map<String, ConfigInstance> getRegistered() {
|
|
return ImmutableMap.copyOf(configs);
|
|
}
|
|
|
|
@Override
|
|
public ConfigInstance get(Class<?> configClass) {
|
|
for (ConfigInstance value : configs.values()) {
|
|
if (value.matchesConfigClass(configClass))
|
|
return value;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public ConfigInstance get(String configClass) {
|
|
return configs.get(configClass);
|
|
}
|
|
|
|
@Override
|
|
public ConfigInstance get(Path configPath) {
|
|
return configsByPath.get(configPath);
|
|
}
|
|
|
|
@Override
|
|
public boolean isRegistered(Class<?> config) {
|
|
for (ConfigInstance value : configs.values()) {
|
|
if (value.matchesConfigClass(config))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isRegistered(String modId) {
|
|
return configs.containsKey(modId);
|
|
}
|
|
|
|
@Override
|
|
public boolean isRegistered(Path configPath) {
|
|
return configsByPath.containsKey(configPath);
|
|
}
|
|
}
|