diff --git a/src/main/java/net/minestom/server/config/Config.java b/src/main/java/net/minestom/server/config/Config.java index b4391c706..a0881a0d1 100644 --- a/src/main/java/net/minestom/server/config/Config.java +++ b/src/main/java/net/minestom/server/config/Config.java @@ -3,8 +3,6 @@ package net.minestom.server.config; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import java.util.Set; - public sealed interface Config permits Configs.InternalConfig { static @NotNull Builder builder() { @@ -17,9 +15,7 @@ public sealed interface Config permits Configs.InternalConfig { @Contract("-> new") static @NotNull ConfigParser parser() { - return new ConfigParserImpl<>(Set.of( - VersionInfo.ofLatest(0, Configs.V0.class) - ), Config.class); + return Configs.PARSER; } int compressionThreshold(); diff --git a/src/main/java/net/minestom/server/config/ConfigParserImpl.java b/src/main/java/net/minestom/server/config/ConfigParserImpl.java index 5021a96fc..dd20d1c13 100644 --- a/src/main/java/net/minestom/server/config/ConfigParserImpl.java +++ b/src/main/java/net/minestom/server/config/ConfigParserImpl.java @@ -12,16 +12,17 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; -final class ConfigParserImpl implements ConfigParser { +record ConfigParserImpl(Function configFactory, + Class latestConfigType, + int latestVersion, + Int2ObjectMap> configClasses, + Int2ObjectMap> configMigrators) implements ConfigParser { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigParserImpl.class); - private final Function configFactory; - private final Class latestConfigType; - private int latestVersion = -1; - private final Int2ObjectMap> configClasses = new Int2ObjectOpenHashMap<>(); - private final Int2ObjectMap> configMigrators = new Int2ObjectOpenHashMap<>(); - ConfigParserImpl(Set> versionInfoSet, Class configType, Function configFactory) { - this.configFactory = configFactory; + static ConfigParserImpl create(Set> versionInfoSet, Class configType, Function configFactory) { + int latestVersion = -1; + final Int2ObjectMap> configClasses = new Int2ObjectOpenHashMap<>(); + final Int2ObjectMap> configMigrators = new Int2ObjectOpenHashMap<>(); for (VersionInfo info : versionInfoSet) { final int v = info.version(); configClasses.put(v, info.clazz()); @@ -29,11 +30,12 @@ final class ConfigParserImpl implements ConfigParser { configMigrators.put(v, (Function) info.migrator()); latestVersion = Math.max(latestVersion, v); } - this.latestConfigType = configClasses.get(latestVersion); + Class latestConfigType = configClasses.get(latestVersion); + return new ConfigParserImpl<>(configFactory, latestConfigType, latestVersion, configClasses, configMigrators); } - ConfigParserImpl(Set> versionInfoSet, Class configType) { - this(versionInfoSet, configType, configType::cast); + static ConfigParserImpl create(Set> versionInfoSet, Class configType) { + return create(versionInfoSet, configType, configType::cast); } @Override diff --git a/src/main/java/net/minestom/server/config/Configs.java b/src/main/java/net/minestom/server/config/Configs.java index 1382fa91e..d1a901e67 100644 --- a/src/main/java/net/minestom/server/config/Configs.java +++ b/src/main/java/net/minestom/server/config/Configs.java @@ -3,12 +3,17 @@ package net.minestom.server.config; import com.google.gson.annotations.JsonAdapter; import net.minestom.server.utils.GsonRecordTypeAdapterFactory; +import java.util.Set; + final class Configs { + static final ConfigParser PARSER = ConfigParserImpl.create(Set.of( + VersionInfo.ofLatest(0, Configs.V0.class) + ), Config.class); + @JsonAdapter(GsonRecordTypeAdapterFactory.class) record V0(int version, int compressionThreshold) implements InternalConfig { } - non-sealed interface InternalConfig extends Config, Config.Meta { } } diff --git a/src/test/java/net/minestom/server/config/ConfigTest.java b/src/test/java/net/minestom/server/config/ConfigTest.java index f76dd481f..78b2c41ef 100644 --- a/src/test/java/net/minestom/server/config/ConfigTest.java +++ b/src/test/java/net/minestom/server/config/ConfigTest.java @@ -14,7 +14,7 @@ public class ConfigTest { @Test public void gsonSerializationWithMigrationTest() { // Setup - final ConfigParserImpl parser = new ConfigParserImpl<>(Set.of( + final ConfigParserImpl parser = ConfigParserImpl.create(Set.of( VersionInfo.of(0, ConfigV0.class, x -> new ConfigV1(1, x.a)), VersionInfo.of(1, ConfigV1.class, x -> new ConfigV2(2, new Foo(x.b == 1 ? "one" : "idk"))), VersionInfo.ofLatest(2, ConfigV2.class)