ConfigSource.java 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package me.lortseam.completeconfig;
  2. import lombok.AccessLevel;
  3. import lombok.Getter;
  4. import me.lortseam.completeconfig.data.Config;
  5. import me.lortseam.completeconfig.util.TypeUtils;
  6. import net.fabricmc.loader.api.FabricLoader;
  7. import org.apache.commons.lang3.ArrayUtils;
  8. import org.apache.logging.log4j.LogManager;
  9. import org.apache.logging.log4j.Logger;
  10. import org.spongepowered.configurate.CommentedConfigurationNode;
  11. import org.spongepowered.configurate.ConfigurateException;
  12. import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
  13. import org.spongepowered.configurate.serialize.TypeSerializerCollection;
  14. import java.nio.file.Path;
  15. import java.nio.file.Paths;
  16. import java.util.Arrays;
  17. import java.util.HashSet;
  18. import java.util.Objects;
  19. import java.util.Set;
  20. final class ConfigSource {
  21. private static final Logger LOGGER = LogManager.getLogger();
  22. private static final Set<ConfigSource> sources = new HashSet<>();
  23. private static TypeSerializerCollection globalTypeSerializers;
  24. static void registerGlobalTypeSerializers(TypeSerializerCollection typeSerializers) {
  25. globalTypeSerializers = TypeUtils.mergeSerializers(globalTypeSerializers, typeSerializers);
  26. }
  27. @Getter(AccessLevel.PACKAGE)
  28. private final String modID;
  29. private final String[] branch;
  30. private final HoconConfigurationLoader loader;
  31. ConfigSource(String modID, String[] branch, TypeSerializerCollection typeSerializers) {
  32. this.modID = modID;
  33. this.branch = branch;
  34. if (!sources.add(this)) {
  35. throw new IllegalArgumentException("A config of the mod " + modID + " with the specified branch " + Arrays.toString(branch) + " already exists!");
  36. }
  37. String[] subPath = ArrayUtils.add(branch, 0, modID);
  38. subPath[subPath.length - 1] = subPath[subPath.length - 1] + ".conf";
  39. Path filePath = Paths.get(FabricLoader.getInstance().getConfigDir().toString(), subPath);
  40. loader = HoconConfigurationLoader.builder()
  41. .path(filePath)
  42. .defaultOptions(options -> {
  43. if (globalTypeSerializers != null) {
  44. options.serializers(builder -> builder.registerAll(globalTypeSerializers));
  45. }
  46. if (typeSerializers != null) {
  47. options.serializers(builder -> builder.registerAll(typeSerializers));
  48. }
  49. return options;
  50. })
  51. .build();
  52. }
  53. void load(Config config) {
  54. try {
  55. CommentedConfigurationNode root = loader.load();
  56. if (!root.virtual()) {
  57. config.apply(root);
  58. }
  59. } catch (ConfigurateException e) {
  60. LOGGER.error("[CompleteConfig] Failed to load config from file!", e);
  61. }
  62. }
  63. void save(Config config) {
  64. CommentedConfigurationNode root = loader.createNode();
  65. config.fetch(root);
  66. try {
  67. loader.save(root);
  68. } catch (ConfigurateException e) {
  69. LOGGER.error("[CompleteConfig] Failed to save config to file!", e);
  70. }
  71. }
  72. @Override
  73. public boolean equals(Object o) {
  74. if (this == o) return true;
  75. if (o == null || getClass() != o.getClass()) return false;
  76. ConfigSource that = (ConfigSource) o;
  77. return modID.equals(that.modID) && Arrays.equals(branch, that.branch);
  78. }
  79. @Override
  80. public int hashCode() {
  81. int result = Objects.hash(modID);
  82. result = 31 * result + Arrays.hashCode(branch);
  83. return result;
  84. }
  85. }