62 lines
3.3 KiB
Java
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());
|
|
};
|
|
}
|
|
}
|