Config type safety casts
This commit is contained in:
parent
f5b297b1bc
commit
346a89a7c3
4 changed files with 51 additions and 50 deletions
|
@ -14,53 +14,51 @@ import ru.betterend.config.ConfigKeeper.StringEntry;
|
|||
|
||||
public abstract class Config {
|
||||
|
||||
protected final ConfigKeeper configKeeper;
|
||||
protected final ConfigKeeper keeper;
|
||||
protected final ConfigWriter writer;
|
||||
protected final String group;
|
||||
|
||||
protected abstract void registerEntries();
|
||||
|
||||
public Config(String group) {
|
||||
this.group = group;
|
||||
this.writer = new ConfigWriter(group);
|
||||
JsonObject settings = writer.load();
|
||||
this.configKeeper = new ConfigKeeper(settings);
|
||||
this.keeper = new ConfigKeeper(settings);
|
||||
this.registerEntries();
|
||||
this.writer.save();
|
||||
}
|
||||
|
||||
public void saveChanges() {
|
||||
this.writer.saveConfig();
|
||||
this.writer.save();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <E extends Entry<?>> E getEntry(ConfigKey key) {
|
||||
return this.configKeeper.getEntry(key);
|
||||
public <T, E extends Entry<T>> E getEntry(ConfigKey key, Class<E> type) {
|
||||
return this.keeper.getEntry(key, type);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <T> T getDefault(ConfigKey key) {
|
||||
Entry<T> entry = configKeeper.getEntry(key);
|
||||
public <T, E extends Entry<T>> T getDefault(ConfigKey key, Class<E> type) {
|
||||
Entry<T> entry = keeper.getEntry(key, type);
|
||||
return entry != null ? entry.getDefault() : null;
|
||||
}
|
||||
|
||||
protected String getString(ConfigKey key, String defaultValue) {
|
||||
String str = configKeeper.getValue(key);
|
||||
String str = keeper.getValue(key, StringEntry.class);
|
||||
if (str == null) {
|
||||
StringEntry entry = configKeeper.registerEntry(key, new StringEntry(defaultValue));
|
||||
StringEntry entry = keeper.registerEntry(key, new StringEntry(defaultValue));
|
||||
return entry.getValue();
|
||||
}
|
||||
return str != null ? str : defaultValue;
|
||||
}
|
||||
|
||||
protected String getString(ConfigKey key) {
|
||||
String str = configKeeper.getValue(key);
|
||||
String str = keeper.getValue(key, StringEntry.class);
|
||||
return str != null ? str : "";
|
||||
}
|
||||
|
||||
protected boolean setString(ConfigKey key, String value) {
|
||||
try {
|
||||
StringEntry entry = configKeeper.getEntry(key);
|
||||
StringEntry entry = keeper.getEntry(key, StringEntry.class);
|
||||
if (entry == null) return false;
|
||||
entry.setValue(value);
|
||||
return true;
|
||||
|
@ -71,22 +69,22 @@ public abstract class Config {
|
|||
}
|
||||
|
||||
protected int getInt(ConfigKey key, int defaultValue) {
|
||||
Integer val = configKeeper.getValue(key);
|
||||
Integer val = keeper.getValue(key, IntegerEntry.class);
|
||||
if (val == null) {
|
||||
IntegerEntry entry = configKeeper.registerEntry(key, new IntegerEntry(defaultValue));
|
||||
IntegerEntry entry = keeper.registerEntry(key, new IntegerEntry(defaultValue));
|
||||
return entry.getValue();
|
||||
}
|
||||
return val != null ? val : defaultValue;
|
||||
}
|
||||
|
||||
protected int getInt(ConfigKey key) {
|
||||
Integer val = configKeeper.getValue(key);
|
||||
Integer val = keeper.getValue(key, IntegerEntry.class);
|
||||
return val != null ? val : 0;
|
||||
}
|
||||
|
||||
protected boolean setInt(ConfigKey key, int value) {
|
||||
try {
|
||||
IntegerEntry entry = configKeeper.getEntry(key);
|
||||
IntegerEntry entry = keeper.getEntry(key, IntegerEntry.class);
|
||||
if (entry == null) return false;
|
||||
entry.setValue(value);
|
||||
return true;
|
||||
|
@ -96,9 +94,9 @@ public abstract class Config {
|
|||
return false;
|
||||
}
|
||||
|
||||
protected <T extends Comparable<T>> boolean setRanged(ConfigKey key, T value) {
|
||||
protected <T extends Comparable<T>, RE extends RangeEntry<T>> boolean setRanged(ConfigKey key, T value, Class<RE> type) {
|
||||
try {
|
||||
RangeEntry<T> entry = configKeeper.getEntry(key);
|
||||
RangeEntry<T> entry = keeper.getEntry(key, type);
|
||||
if (entry == null) return false;
|
||||
entry.setValue(value);
|
||||
return true;
|
||||
|
@ -109,22 +107,22 @@ public abstract class Config {
|
|||
}
|
||||
|
||||
protected float getFloat(ConfigKey key, float defaultValue) {
|
||||
Float val = configKeeper.getValue(key);
|
||||
Float val = keeper.getValue(key, FloatEntry.class);
|
||||
if (val == null) {
|
||||
FloatEntry entry = configKeeper.registerEntry(key, new FloatEntry(defaultValue));
|
||||
FloatEntry entry = keeper.registerEntry(key, new FloatEntry(defaultValue));
|
||||
return entry.getValue();
|
||||
}
|
||||
return val != null ? val : defaultValue;
|
||||
}
|
||||
|
||||
protected float getFloat(ConfigKey key) {
|
||||
Float val = configKeeper.getValue(key);
|
||||
Float val = keeper.getValue(key, FloatEntry.class);
|
||||
return val != null ? val : 0.0F;
|
||||
}
|
||||
|
||||
protected boolean setFloat(ConfigKey key, float value) {
|
||||
try {
|
||||
FloatEntry entry = configKeeper.getEntry(key);
|
||||
FloatEntry entry = keeper.getEntry(key, FloatEntry.class);
|
||||
if (entry == null) return false;
|
||||
entry.setValue(value);
|
||||
return true;
|
||||
|
@ -135,22 +133,22 @@ public abstract class Config {
|
|||
}
|
||||
|
||||
protected boolean getBoolean(ConfigKey key, boolean defaultValue) {
|
||||
Boolean val = configKeeper.getValue(key);
|
||||
Boolean val = keeper.getValue(key, BooleanEntry.class);
|
||||
if (val == null) {
|
||||
BooleanEntry entry = configKeeper.registerEntry(key, new BooleanEntry(defaultValue));
|
||||
BooleanEntry entry = keeper.registerEntry(key, new BooleanEntry(defaultValue));
|
||||
return entry.getValue();
|
||||
}
|
||||
return val != null ? val : defaultValue;
|
||||
}
|
||||
|
||||
protected boolean getBoolean(ConfigKey key) {
|
||||
Boolean val = configKeeper.getValue(key);
|
||||
Boolean val = keeper.getValue(key, BooleanEntry.class);
|
||||
return val != null ? val : false;
|
||||
}
|
||||
|
||||
protected boolean setBoolean(ConfigKey key, boolean value) {
|
||||
try {
|
||||
BooleanEntry entry = configKeeper.getEntry(key);
|
||||
BooleanEntry entry = keeper.getEntry(key, BooleanEntry.class);
|
||||
if (entry == null) return false;
|
||||
entry.setValue(value);
|
||||
return true;
|
||||
|
|
|
@ -75,14 +75,17 @@ public final class ConfigKeeper {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
@SuppressWarnings("unchecked")
|
||||
public <E extends Entry<?>> E getEntry(ConfigKey key) {
|
||||
return (E) this.configEntries.get(key);
|
||||
public <T, E extends Entry<T>> E getEntry(ConfigKey key, Class<E> type) {
|
||||
Entry<?> entry = this.configEntries.get(key);
|
||||
if (type.isInstance(entry)) {
|
||||
return type.cast(entry);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <T> T getValue(ConfigKey key) {
|
||||
Entry<T> entry = this.getEntry(key);
|
||||
public <T, E extends Entry<T>> T getValue(ConfigKey key, Class<E> type) {
|
||||
Entry<T> entry = this.getEntry(key, type);
|
||||
if (entry == null) {
|
||||
return null;
|
||||
}
|
||||
|
@ -207,11 +210,8 @@ public final class ConfigKeeper {
|
|||
|
||||
public static class EnumEntry<T extends Enum<T>> extends Entry<T> {
|
||||
|
||||
private final Type type;
|
||||
|
||||
public EnumEntry(T defaultValue) {
|
||||
super(defaultValue);
|
||||
this.type = new EntryType().getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -228,10 +228,6 @@ public final class ConfigKeeper {
|
|||
public void toJson(JsonObject json, String key, T value) {
|
||||
json.addProperty(key, JsonFactory.GSON.toJson(json, type));
|
||||
}
|
||||
|
||||
private class EntryType extends TypeToken<T> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract class RangeEntry<T extends Comparable<T>> extends Entry<T> {
|
||||
|
@ -261,6 +257,7 @@ public final class ConfigKeeper {
|
|||
public static abstract class Entry<T> {
|
||||
|
||||
protected final T defaultValue;
|
||||
protected final Type type;
|
||||
protected Consumer<T> writer;
|
||||
protected Supplier<T> reader;
|
||||
|
||||
|
@ -269,6 +266,7 @@ public final class ConfigKeeper {
|
|||
|
||||
public Entry (T defaultValue) {
|
||||
this.defaultValue = defaultValue;
|
||||
this.type = new EntryType().getType();
|
||||
}
|
||||
|
||||
protected void setWriter(Consumer<T> writer) {
|
||||
|
@ -279,6 +277,10 @@ public final class ConfigKeeper {
|
|||
this.reader = reader;
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public T getValue() {
|
||||
return this.reader.get();
|
||||
}
|
||||
|
@ -294,5 +296,9 @@ public final class ConfigKeeper {
|
|||
public void setDefault() {
|
||||
this.setValue(defaultValue);
|
||||
}
|
||||
|
||||
protected class EntryType extends TypeToken<T> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ public class ConfigWriter {
|
|||
return configObject;
|
||||
}
|
||||
|
||||
public void saveConfig() {
|
||||
public void save() {
|
||||
if (configObject == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -41,10 +41,6 @@ public class ConfigWriter {
|
|||
return configObject;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
save(configFile, configObject);
|
||||
}
|
||||
|
||||
public void save(JsonElement config) {
|
||||
this.configObject = config.getAsJsonObject();
|
||||
save(configFile, config);
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.util.function.BiFunction;
|
|||
import org.jetbrains.annotations.Nullable;
|
||||
import net.minecraft.util.Identifier;
|
||||
import ru.betterend.config.ConfigKeeper.Entry;
|
||||
import ru.betterend.config.ConfigKeeper.RangeEntry;
|
||||
|
||||
public class IdConfig extends Config {
|
||||
|
||||
|
@ -22,13 +23,13 @@ public class IdConfig extends Config {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
public <E extends Entry<?>> E getEntry(Identifier id, String key) {
|
||||
return this.getEntry(createKey(id, key));
|
||||
public <T, E extends Entry<T>> E getEntry(Identifier id, String key, Class<E> type) {
|
||||
return this.getEntry(createKey(id, key), type);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <T> T getDefault(Identifier id, String key) {
|
||||
return this.getDefault(createKey(id, key));
|
||||
public <T, E extends Entry<T>> T getDefault(Identifier id, String key, Class<E> type) {
|
||||
return this.getDefault(createKey(id, key), type);
|
||||
}
|
||||
|
||||
public String getString(Identifier id, String key, String defaultValue) {
|
||||
|
@ -55,8 +56,8 @@ public class IdConfig extends Config {
|
|||
return this.setInt(createKey(id, key), value);
|
||||
}
|
||||
|
||||
public <T extends Comparable<T>> boolean setRanged(Identifier id, String key, T value) {
|
||||
return this.setRanged(createKey(id, key), value);
|
||||
public <T extends Comparable<T>, RE extends RangeEntry<T>> boolean setRanged(Identifier id, String key, T value, Class<RE> type) {
|
||||
return this.setRanged(createKey(id, key), value, type);
|
||||
}
|
||||
|
||||
public float getFloat(Identifier id, String key, float defaultValue) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue