java-commons/muscript-json/src/main/java/io/gitlab/jfronny/muscript/json/impl/DynamicSerializer.java
JFronny 24aab51a4b
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
feat(muscript-gson): rename to muscript-json and port to commons-serialize-json
2024-04-12 21:19:36 +02:00

62 lines
3.3 KiB
Java

package io.gitlab.jfronny.muscript.json.impl;
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.databind.SerializerFor;
import io.gitlab.jfronny.commons.serialize.databind.TypeAdapter;
import io.gitlab.jfronny.muscript.data.additional.DDate;
import io.gitlab.jfronny.muscript.data.additional.DEnum;
import io.gitlab.jfronny.muscript.data.additional.DTime;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import io.gitlab.jfronny.muscript.json.impl.typed.*;
import io.gitlab.jfronny.muscript.json.impl.typed.additional.*;
@SerializerFor(targets = Dynamic.class)
public class DynamicSerializer extends TypeAdapter<Dynamic> {
public final DObjectSerializer dObject = new DObjectSerializer();
public final DListSerializer dList = new DListSerializer();
public final DNullSerializer dNull = new DNullSerializer();
public final DBoolSerializer dBool = new DBoolSerializer();
public final DNumberSerializer dNumber = new DNumberSerializer();
public final DStringSerializer dString = new DStringSerializer();
public final DCallableSerializer dCallable = new DCallableSerializer();
public final DynamicBaseSerializer dynamicBase = new DynamicBaseSerializer();
public final DDateSerializer dDate = new DDateSerializer();
public final DTimeSerializer dTime = new DTimeSerializer();
public final DEnumSerializer dEnum = new DEnumSerializer();
public DynamicSerializer() {
DynamicSerializerHolder.setInstance(this);
}
@Override
public <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void serialize(Dynamic value, Writer writer) throws TEx, MalformedDataException {
if (value == null) writer.nullValue();
else if (value instanceof DDate date) dDate.serialize(date, writer);
else if (value instanceof DTime time) dTime.serialize(time, writer);
else if (value instanceof DEnum enm) dEnum.serialize(enm, writer);
else if (value.isObject()) dObject.serialize(value.asObject(), writer);
else if (value.isList()) dList.serialize(value.asList(), writer);
else if (value instanceof DNull n) dNull.serialize(n, writer);
else if (value.isBool()) dBool.serialize(value.asBool(), writer);
else if (value.isNumber()) dNumber.serialize(value.asNumber(), writer);
else if (value.isString()) dString.serialize(value.asString(), writer);
else if (value.isCallable()) dCallable.serialize(value.asCallable(), writer);
else throw new IllegalArgumentException("Unexpected dynamic type for: " + value);
}
@Override
public <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> Dynamic deserialize(Reader reader) throws TEx, MalformedDataException {
return switch (reader.peek()) {
case BEGIN_OBJECT -> dObject.deserialize(reader);
case BEGIN_ARRAY -> dList.deserialize(reader);
case NULL -> dNull.deserialize(reader);
case BOOLEAN -> dBool.deserialize(reader);
case NUMBER -> dNumber.deserialize(reader);
case STRING -> dString.deserialize(reader);
default -> throw new IllegalStateException("Unsupported token for beginning of Dynamic: " + reader.peek());
};
}
}