From 569288c6c8be73f6d95ea550b14ff9c368c043a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 24 Jul 2022 23:30:24 +0200 Subject: [PATCH] Actually allow numeric indices for sides like api doc claims. Fixes #165. --- .../oc2/common/bus/RPCDeviceBusAdapter.java | 2 ++ .../gson/SideJsonDeserializer.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/main/java/li/cil/oc2/common/serialization/gson/SideJsonDeserializer.java diff --git a/src/main/java/li/cil/oc2/common/bus/RPCDeviceBusAdapter.java b/src/main/java/li/cil/oc2/common/bus/RPCDeviceBusAdapter.java index f8e9561d..1ac8b717 100644 --- a/src/main/java/li/cil/oc2/common/bus/RPCDeviceBusAdapter.java +++ b/src/main/java/li/cil/oc2/common/bus/RPCDeviceBusAdapter.java @@ -8,6 +8,7 @@ import li.cil.ceres.api.Serialized; import li.cil.oc2.api.bus.DeviceBusController; import li.cil.oc2.api.bus.device.Device; import li.cil.oc2.api.bus.device.rpc.*; +import li.cil.oc2.api.util.Side; import li.cil.oc2.common.Constants; import li.cil.oc2.common.bus.device.rpc.RPCDeviceList; import li.cil.oc2.common.bus.device.rpc.RPCMethodParameterTypeAdapters; @@ -67,6 +68,7 @@ public final class RPCDeviceBusAdapter implements Steppable { .registerTypeAdapter(RPCDeviceWithIdentifier.class, new RPCDeviceWithIdentifierJsonSerializer()) .registerTypeHierarchyAdapter(RPCMethod.class, new RPCMethodJsonSerializer()) .registerTypeAdapter(EmptyMethodGroup.class, new EmptyRPCMethodGroupSerializer()) + .registerTypeAdapter(Side.class, new SideJsonDeserializer()) .create(); } diff --git a/src/main/java/li/cil/oc2/common/serialization/gson/SideJsonDeserializer.java b/src/main/java/li/cil/oc2/common/serialization/gson/SideJsonDeserializer.java new file mode 100644 index 00000000..f2b483f9 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/serialization/gson/SideJsonDeserializer.java @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: MIT */ + +package li.cil.oc2.common.serialization.gson; + +import com.google.gson.*; +import com.google.gson.internal.bind.TypeAdapters; +import com.google.gson.reflect.TypeToken; +import li.cil.oc2.api.util.Side; + +import java.lang.reflect.Type; + +public final class SideJsonDeserializer implements JsonDeserializer { + @Override + public Side deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonPrimitive()) { + final JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive(); + if (jsonPrimitive.isNumber()) { + return Side.values()[jsonPrimitive.getAsNumber().intValue()]; + } + } + + return (Side) TypeAdapters.ENUM_FACTORY.create(null, TypeToken.get(typeOfT)).fromJsonTree(json); + } +}