mirror of https://github.com/Minestom/Minestom.git
Make ConfigParserImpl a record, make the default parser a constant
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
74dd0884f1
commit
5e92d4c443
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue