ConfigSource.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package me.lortseam.completeconfig.io;
  2. import lombok.EqualsAndHashCode;
  3. import lombok.Getter;
  4. import lombok.ToString;
  5. import lombok.extern.log4j.Log4j2;
  6. import me.lortseam.completeconfig.CompleteConfig;
  7. import me.lortseam.completeconfig.data.Config;
  8. import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
  9. import net.fabricmc.loader.api.FabricLoader;
  10. import org.apache.commons.lang3.ArrayUtils;
  11. import org.spongepowered.configurate.CommentedConfigurationNode;
  12. import org.spongepowered.configurate.ConfigurateException;
  13. import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
  14. import org.spongepowered.configurate.serialize.TypeSerializerCollection;
  15. import java.nio.file.Path;
  16. import java.util.Arrays;
  17. import java.util.HashSet;
  18. import java.util.Objects;
  19. import java.util.Set;
  20. @Log4j2
  21. @EqualsAndHashCode(onlyExplicitlyIncluded = true)
  22. @ToString(onlyExplicitlyIncluded = true)
  23. public final class ConfigSource {
  24. private static final TypeSerializerCollection GLOBAL_TYPE_SERIALIZERS = TypeSerializerCollection.builder()
  25. .registerExact(TextColorSerializer.INSTANCE)
  26. .build();
  27. private static final Set<ConfigSource> sources = new HashSet<>();
  28. @EqualsAndHashCode.Include
  29. @ToString.Include
  30. @Getter
  31. private final String modID;
  32. @EqualsAndHashCode.Include
  33. @ToString.Include
  34. private final String[] branch;
  35. private final HoconConfigurationLoader loader;
  36. public ConfigSource(String modID, String[] branch) {
  37. this.modID = modID;
  38. this.branch = branch;
  39. if (!sources.add(this)) {
  40. throw new IllegalArgumentException("A config of the mod " + modID + " with the specified branch " + Arrays.toString(branch) + " already exists!");
  41. }
  42. Path path = FabricLoader.getInstance().getConfigDir();
  43. String[] subPath = ArrayUtils.add(branch, 0, modID);
  44. subPath[subPath.length - 1] = subPath[subPath.length - 1] + ".conf";
  45. for (String child : subPath) {
  46. path = path.resolve(child);
  47. }
  48. loader = HoconConfigurationLoader.builder()
  49. .path(path)
  50. .defaultOptions(options -> options.serializers(builder -> {
  51. builder.registerAll(GLOBAL_TYPE_SERIALIZERS);
  52. CompleteConfig.getExtensions().stream().map(CompleteConfigExtension::getTypeSerializers).filter(Objects::nonNull).forEach(builder::registerAll);
  53. }))
  54. .build();
  55. }
  56. public void load(Config config) {
  57. try {
  58. CommentedConfigurationNode root = loader.load();
  59. if (!root.virtual()) {
  60. config.apply(root);
  61. }
  62. } catch (ConfigurateException e) {
  63. logger.error("[CompleteConfig] Failed to load config from file!", e);
  64. }
  65. save(config);
  66. }
  67. public void save(Config config) {
  68. CommentedConfigurationNode root = loader.createNode();
  69. config.fetch(root);
  70. try {
  71. loader.save(root);
  72. } catch (ConfigurateException e) {
  73. logger.error("[CompleteConfig] Failed to save config to file!", e);
  74. }
  75. }
  76. }