diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcBoolean.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcBoolean.java index 208e9239..40c36b39 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcBoolean.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcBoolean.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class RpcBoolean extends RpcObject { +public final class RpcBoolean implements RpcObject { private final boolean value; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcList.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcList.java index c0b44db1..0743d45c 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcList.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcList.java @@ -5,7 +5,7 @@ import java.util.List; @RequiredArgsConstructor -public final class RpcList extends RpcObject { +public final class RpcList implements RpcObject { private final List list; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcMap.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcMap.java index 64f80daa..b517009f 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcMap.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcMap.java @@ -5,7 +5,7 @@ import java.util.Map; @RequiredArgsConstructor -public final class RpcMap extends RpcObject { +public final class RpcMap implements RpcObject { private final Map map; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNull.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNull.java index a1da460d..c272be03 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNull.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNull.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.Map; -public final class RpcNull extends RpcObject { +public final class RpcNull implements RpcObject { @Override public boolean isNull() { return true; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNumber.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNumber.java index 144054ea..b846c621 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNumber.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNumber.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class RpcNumber extends RpcObject { +public final class RpcNumber implements RpcObject { private final Number value; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcObject.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcObject.java index 65e95e21..ab3c4139 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcObject.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcObject.java @@ -3,76 +3,77 @@ import java.util.List; import java.util.Map; -public abstract class RpcObject { +public interface RpcObject { - RpcObject() { - } - - public boolean isNull() { + default boolean isNull() { return false; } - public boolean isBoolean() { + default boolean isBoolean() { return false; } - public boolean isList() { + default boolean isList() { return false; } - public boolean isMap() { + default boolean isMap() { return false; } - public boolean isNumber() { + default boolean isNumber() { return false; } - public boolean isString() { + default boolean isString() { return false; } - public Boolean asBoolean() { + default Boolean asBoolean() { throw new IllegalStateException(); } - public List asList() { + default List asList() { throw new IllegalStateException(); } - public Map asMap() { + default Map asMap() { throw new IllegalStateException(); } - public Number asNumber() { + default Number asNumber() { throw new IllegalStateException(); } - public String asString() { + default String asString() { throw new IllegalStateException(); } - public static RpcObject ofNull() { + static RpcObject ofNull() { return new RpcNull(); } - public static RpcObject of(boolean value) { + static RpcObject of(boolean value) { return new RpcBoolean(value); } - public static RpcObject of(List list) { + static RpcObject of(List list) { return list == null ? new RpcNull() : new RpcList(list); } - public static RpcObject of(Map map) { + static RpcObject of(Map map) { return map == null ? new RpcNull() : new RpcMap(map); } - public static RpcObject of(Number value) { + static RpcObject of(long value) { + return new RpcNumber(value); + } + + static RpcObject of(Number value) { return value == null ? new RpcNull() : new RpcNumber(value); } - public static RpcObject of(String value) { + static RpcObject of(String value) { return value == null ? new RpcNull() : new RpcString(value); } diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcString.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcString.java index ffac54df..6e7b91e1 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcString.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/RpcString.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class RpcString extends RpcObject { +public final class RpcString implements RpcObject { private final String value; diff --git a/transport/src/main/java/com/strategyobject/substrateclient/transport/coder/RpcObjectTypeAdapter.java b/transport/src/main/java/com/strategyobject/substrateclient/transport/coder/RpcObjectTypeAdapter.java index eef97e8a..c6e13562 100644 --- a/transport/src/main/java/com/strategyobject/substrateclient/transport/coder/RpcObjectTypeAdapter.java +++ b/transport/src/main/java/com/strategyobject/substrateclient/transport/coder/RpcObjectTypeAdapter.java @@ -7,6 +7,8 @@ import lombok.val; import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; @@ -25,7 +27,7 @@ public RpcObject read(JsonReader in) throws IOException { case BOOLEAN: return new RpcBoolean(in.nextBoolean()); case NUMBER: - return new RpcNumber(in.nextDouble()); + return new RpcNumber(parseNumber(in)); case STRING: return new RpcString(in.nextString()); case BEGIN_ARRAY: @@ -48,4 +50,21 @@ public RpcObject read(JsonReader in) throws IOException { return new RpcMap(map); } } + + private Number parseNumber(JsonReader in) throws IOException { + val value = in.nextString(); + try { + return Long.parseLong(value); + } catch (NumberFormatException ignored) { + // Ignore + } + + try { + return new BigInteger(value); + } catch (NumberFormatException ignored) { + // Ignore + } + + return new BigDecimal(value); + } } diff --git a/transport/src/test/java/com/strategyobject/substrateclient/transport/coder/RpcCoderTest.java b/transport/src/test/java/com/strategyobject/substrateclient/transport/coder/RpcCoderTest.java index 38ef8171..206cb46c 100644 --- a/transport/src/test/java/com/strategyobject/substrateclient/transport/coder/RpcCoderTest.java +++ b/transport/src/test/java/com/strategyobject/substrateclient/transport/coder/RpcCoderTest.java @@ -30,6 +30,24 @@ void decodeNullResult() { .isEqualTo(expected); } + @Test + void DecodeLongNumber() { + val json = "{\n" + + " \"result\": 506884800,\n" + + " \"id\": 0,\n" + + " \"jsonrpc\": \"3.0\"\n" + + "}"; + val actual = RpcCoder.decodeJson(json); + + val expected = new JsonRpcResponse(); + expected.jsonrpc = "3.0"; + expected.id = 0; + expected.result = RpcObject.of(506884800); + assertThat(actual) + .usingRecursiveComparison() + .isEqualTo(expected); + } + @Test void decodeJson() { val json = "{\n" +