Respackopts/src/main/java/io/gitlab/jfronny/respackopts/gson/entry/NumericEntrySerializer.java

60 lines
2.8 KiB
Java

package io.gitlab.jfronny.respackopts.gson.entry;
import io.gitlab.jfronny.commons.serialize.MalformedDataException;
import io.gitlab.jfronny.commons.serialize.SerializeReader;
import io.gitlab.jfronny.commons.serialize.SerializeWriter;
import io.gitlab.jfronny.commons.serialize.Token;
import io.gitlab.jfronny.commons.serialize.databind.api.SerializerFor;
import io.gitlab.jfronny.commons.serialize.databind.api.TypeAdapter;
import io.gitlab.jfronny.respackopts.model.enums.PackReloadType;
import io.gitlab.jfronny.respackopts.model.tree.ConfigNumericEntry;
import java.util.Set;
@SerializerFor(targets = ConfigNumericEntry.class)
public class NumericEntrySerializer extends TypeAdapter<ConfigNumericEntry> {
public static final Set<String> TYPES = Set.of("numeric", "number", "slider", "integer", "int", "long", "whole");
public static final Set<String> INT_TYPES = Set.of("integer", "int", "long", "whole");
@Override
public <TEx extends Exception, Writer extends SerializeWriter<TEx, Writer>> void serialize(ConfigNumericEntry configNumericEntry, Writer writer) throws TEx, MalformedDataException {
writer.value(configNumericEntry.getValue());
}
@Override
public <TEx extends Exception, Reader extends SerializeReader<TEx, Reader>> ConfigNumericEntry deserialize(Reader reader) throws TEx, MalformedDataException {
ConfigNumericEntry result = new ConfigNumericEntry();
if (reader.peek() == Token.NUMBER) {
double value = reader.nextDouble();
result.setValue(value);
result.setDefault(value);
return result;
} else if (reader.peek() == Token.BEGIN_OBJECT) {
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();
switch (key) {
case "type" -> {
if (!TYPES.contains(reader.nextString())) {
throw new MalformedDataException("Invalid type for numeric entry");
}
}
case "default" -> {
double value = reader.nextDouble();
result.setDefault(value);
result.setValue(value);
}
case "reloadType" -> result.setReloadType(PackReloadType.valueOf(reader.nextString()));
case "min" -> result.setMin(reader.nextDouble());
case "max" -> result.setMax(reader.nextDouble());
default -> throw new MalformedDataException("Unknown key in numeric entry: " + key);
}
}
reader.endObject();
return result;
} else {
throw new MalformedDataException("Invalid data type for numeric entry");
}
}
}