Skip to content

Commit 751668d

Browse files
authored
Merge pull request #21 from strategyobject/bugfix/long-num
Fix parsing of long numbers in RpcObject
2 parents 2907b3b + 76e90ad commit 751668d

File tree

9 files changed

+66
-28
lines changed

9 files changed

+66
-28
lines changed

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcBoolean.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44

55
@RequiredArgsConstructor
6-
public final class RpcBoolean extends RpcObject {
6+
public final class RpcBoolean implements RpcObject {
77

88
private final boolean value;
99

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcList.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import java.util.List;
66

77
@RequiredArgsConstructor
8-
public final class RpcList extends RpcObject {
8+
public final class RpcList implements RpcObject {
99

1010
private final List<RpcObject> list;
1111

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcMap.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import java.util.Map;
66

77
@RequiredArgsConstructor
8-
public final class RpcMap extends RpcObject {
8+
public final class RpcMap implements RpcObject {
99

1010
private final Map<String, RpcObject> map;
1111

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNull.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.util.List;
44
import java.util.Map;
55

6-
public final class RpcNull extends RpcObject {
6+
public final class RpcNull implements RpcObject {
77
@Override
88
public boolean isNull() {
99
return true;

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcNumber.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44

55
@RequiredArgsConstructor
6-
public final class RpcNumber extends RpcObject {
6+
public final class RpcNumber implements RpcObject {
77

88
private final Number value;
99

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcObject.java

+22-21
Original file line numberDiff line numberDiff line change
@@ -3,76 +3,77 @@
33
import java.util.List;
44
import java.util.Map;
55

6-
public abstract class RpcObject {
6+
public interface RpcObject {
77

8-
RpcObject() {
9-
}
10-
11-
public boolean isNull() {
8+
default boolean isNull() {
129
return false;
1310
}
1411

15-
public boolean isBoolean() {
12+
default boolean isBoolean() {
1613
return false;
1714
}
1815

19-
public boolean isList() {
16+
default boolean isList() {
2017
return false;
2118
}
2219

23-
public boolean isMap() {
20+
default boolean isMap() {
2421
return false;
2522
}
2623

27-
public boolean isNumber() {
24+
default boolean isNumber() {
2825
return false;
2926
}
3027

31-
public boolean isString() {
28+
default boolean isString() {
3229
return false;
3330
}
3431

35-
public Boolean asBoolean() {
32+
default Boolean asBoolean() {
3633
throw new IllegalStateException();
3734
}
3835

39-
public List<RpcObject> asList() {
36+
default List<RpcObject> asList() {
4037
throw new IllegalStateException();
4138
}
4239

43-
public Map<String, RpcObject> asMap() {
40+
default Map<String, RpcObject> asMap() {
4441
throw new IllegalStateException();
4542
}
4643

47-
public Number asNumber() {
44+
default Number asNumber() {
4845
throw new IllegalStateException();
4946
}
5047

51-
public String asString() {
48+
default String asString() {
5249
throw new IllegalStateException();
5350
}
5451

55-
public static RpcObject ofNull() {
52+
static RpcObject ofNull() {
5653
return new RpcNull();
5754
}
5855

59-
public static RpcObject of(boolean value) {
56+
static RpcObject of(boolean value) {
6057
return new RpcBoolean(value);
6158
}
6259

63-
public static RpcObject of(List<RpcObject> list) {
60+
static RpcObject of(List<RpcObject> list) {
6461
return list == null ? new RpcNull() : new RpcList(list);
6562
}
6663

67-
public static RpcObject of(Map<String, RpcObject> map) {
64+
static RpcObject of(Map<String, RpcObject> map) {
6865
return map == null ? new RpcNull() : new RpcMap(map);
6966
}
7067

71-
public static RpcObject of(Number value) {
68+
static RpcObject of(long value) {
69+
return new RpcNumber(value);
70+
}
71+
72+
static RpcObject of(Number value) {
7273
return value == null ? new RpcNull() : new RpcNumber(value);
7374
}
7475

75-
public static RpcObject of(String value) {
76+
static RpcObject of(String value) {
7677
return value == null ? new RpcNull() : new RpcString(value);
7778
}
7879

transport/src/main/java/com/strategyobject/substrateclient/transport/RpcString.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44

55
@RequiredArgsConstructor
6-
public final class RpcString extends RpcObject {
6+
public final class RpcString implements RpcObject {
77

88
private final String value;
99

transport/src/main/java/com/strategyobject/substrateclient/transport/coder/RpcObjectTypeAdapter.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import lombok.val;
88

99
import java.io.IOException;
10+
import java.math.BigDecimal;
11+
import java.math.BigInteger;
1012
import java.util.ArrayList;
1113
import java.util.HashMap;
1214

@@ -25,7 +27,7 @@ public RpcObject read(JsonReader in) throws IOException {
2527
case BOOLEAN:
2628
return new RpcBoolean(in.nextBoolean());
2729
case NUMBER:
28-
return new RpcNumber(in.nextDouble());
30+
return new RpcNumber(parseNumber(in));
2931
case STRING:
3032
return new RpcString(in.nextString());
3133
case BEGIN_ARRAY:
@@ -48,4 +50,21 @@ public RpcObject read(JsonReader in) throws IOException {
4850
return new RpcMap(map);
4951
}
5052
}
53+
54+
private Number parseNumber(JsonReader in) throws IOException {
55+
val value = in.nextString();
56+
try {
57+
return Long.parseLong(value);
58+
} catch (NumberFormatException ignored) {
59+
// Ignore
60+
}
61+
62+
try {
63+
return new BigInteger(value);
64+
} catch (NumberFormatException ignored) {
65+
// Ignore
66+
}
67+
68+
return new BigDecimal(value);
69+
}
5170
}

transport/src/test/java/com/strategyobject/substrateclient/transport/coder/RpcCoderTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ void decodeNullResult() {
3030
.isEqualTo(expected);
3131
}
3232

33+
@Test
34+
void DecodeLongNumber() {
35+
val json = "{\n" +
36+
" \"result\": 506884800,\n" +
37+
" \"id\": 0,\n" +
38+
" \"jsonrpc\": \"3.0\"\n" +
39+
"}";
40+
val actual = RpcCoder.decodeJson(json);
41+
42+
val expected = new JsonRpcResponse();
43+
expected.jsonrpc = "3.0";
44+
expected.id = 0;
45+
expected.result = RpcObject.of(506884800);
46+
assertThat(actual)
47+
.usingRecursiveComparison()
48+
.isEqualTo(expected);
49+
}
50+
3351
@Test
3452
void decodeJson() {
3553
val json = "{\n" +

0 commit comments

Comments
 (0)