Make ConfigParserImpl a record, make the default parser a constant

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2022-07-01 21:50:50 +02:00
parent 74dd0884f1
commit 5e92d4c443
4 changed files with 21 additions and 18 deletions

View File

@ -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<Config> parser() {
return new ConfigParserImpl<>(Set.of(
VersionInfo.ofLatest(0, Configs.V0.class)
), Config.class);
return Configs.PARSER;
}
int compressionThreshold();

View File

@ -12,16 +12,17 @@ import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
final class ConfigParserImpl<R> implements ConfigParser<R> {
record ConfigParserImpl<R>(Function<Config.Meta, R> configFactory,
Class<? extends Config.Meta> latestConfigType,
int latestVersion,
Int2ObjectMap<Class<? extends Config.Meta>> configClasses,
Int2ObjectMap<Function<Object, Object>> configMigrators) implements ConfigParser<R> {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigParserImpl.class);
private final Function<Config.Meta, R> configFactory;
private final Class<? extends Config.Meta> latestConfigType;
private int latestVersion = -1;
private final Int2ObjectMap<Class<? extends Config.Meta>> configClasses = new Int2ObjectOpenHashMap<>();
private final Int2ObjectMap<Function<Object, Object>> configMigrators = new Int2ObjectOpenHashMap<>();
ConfigParserImpl(Set<VersionInfo<?>> versionInfoSet, Class<R> configType, Function<Config.Meta, R> configFactory) {
this.configFactory = configFactory;
static <R> ConfigParserImpl<R> create(Set<VersionInfo<?>> versionInfoSet, Class<R> configType, Function<Config.Meta, R> configFactory) {
int latestVersion = -1;
final Int2ObjectMap<Class<? extends Config.Meta>> configClasses = new Int2ObjectOpenHashMap<>();
final Int2ObjectMap<Function<Object, Object>> configMigrators = new Int2ObjectOpenHashMap<>();
for (VersionInfo<?> info : versionInfoSet) {
final int v = info.version();
configClasses.put(v, info.clazz());
@ -29,11 +30,12 @@ final class ConfigParserImpl<R> implements ConfigParser<R> {
configMigrators.put(v, (Function<Object, Object>) info.migrator());
latestVersion = Math.max(latestVersion, v);
}
this.latestConfigType = configClasses.get(latestVersion);
Class<? extends Config.Meta> latestConfigType = configClasses.get(latestVersion);
return new ConfigParserImpl<>(configFactory, latestConfigType, latestVersion, configClasses, configMigrators);
}
ConfigParserImpl(Set<VersionInfo<?>> versionInfoSet, Class<R> configType) {
this(versionInfoSet, configType, configType::cast);
static <R> ConfigParserImpl<R> create(Set<VersionInfo<?>> versionInfoSet, Class<R> configType) {
return create(versionInfoSet, configType, configType::cast);
}
@Override

View File

@ -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<Config> 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 {
}
}

View File

@ -14,7 +14,7 @@ public class ConfigTest {
@Test
public void gsonSerializationWithMigrationTest() {
// Setup
final ConfigParserImpl<Conf> parser = new ConfigParserImpl<>(Set.of(
final ConfigParserImpl<Conf> 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)