authorgravatar for johnnymarler@gmail.comJonathan Marler <johnnymarler@gmail.com> 2021-01-28 19:15:38-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-01 12:40:49-08:00
log06b29c854656a1f9320ee16024b1c3a6b78180a5
treee26cc2f2abdc8215f5699ccfd030709f38da84fa
parent1032a693211dd96abe349bfa76b43bb1f226cfda

std.json large number support


1 files changed, 20 insertions(+), 3 deletions(-)

lib/std/json.zig+20-3
......@@ -1255,6 +1255,7 @@ pub const Value = union(enum) {
12551255 Bool: bool,
12561256 Integer: i64,
12571257 Float: f64,
1258 NumberString: []const u8,
12581259 String: []const u8,
12591260 Array: Array,
12601261 Object: ObjectMap,
......@@ -1269,6 +1270,7 @@ pub const Value = union(enum) {
12691270 .Bool => |inner| try stringify(inner, options, out_stream),
12701271 .Integer => |inner| try stringify(inner, options, out_stream),
12711272 .Float => |inner| try stringify(inner, options, out_stream),
1273 .NumberString => |inner| try out_stream.writeAll(inner),
12721274 .String => |inner| try stringify(inner, options, out_stream),
12731275 .Array => |inner| try stringify(inner.items, options, out_stream),
12741276 .Object => |inner| {
......@@ -1338,6 +1340,12 @@ test "Value.jsonStringify" {
13381340 try (Value{ .Integer = 42 }).jsonStringify(.{}, fbs.writer());
13391341 testing.expectEqualSlices(u8, fbs.getWritten(), "42");
13401342 }
1343 {
1344 var buffer: [10]u8 = undefined;
1345 var fbs = std.io.fixedBufferStream(&buffer);
1346 try (Value{ .NumberString = "43" }).jsonStringify(.{}, fbs.writer());
1347 testing.expectEqualSlices(u8, fbs.getWritten(), "43");
1348 }
13411349 {
13421350 var buffer: [10]u8 = undefined;
13431351 var fbs = std.io.fixedBufferStream(&buffer);
......@@ -1356,7 +1364,7 @@ test "Value.jsonStringify" {
13561364 var vals = [_]Value{
13571365 .{ .Integer = 1 },
13581366 .{ .Integer = 2 },
1359 .{ .Integer = 3 },
1367 .{ .NumberString = "3" },
13601368 };
13611369 try (Value{
13621370 .Array = Array.fromOwnedSlice(undefined, &vals),
......@@ -2205,7 +2213,12 @@ pub const Parser = struct {
22052213
22062214 fn parseNumber(p: *Parser, n: std.meta.TagPayload(Token, Token.Number), input: []const u8, i: usize) !Value {
22072215 return if (n.is_integer)
2208 Value{ .Integer = try std.fmt.parseInt(i64, n.slice(input, i), 10) }
2216 Value{
2217 .Integer = std.fmt.parseInt(i64, n.slice(input, i), 10) catch |e| switch (e) {
2218 error.Overflow => return Value{ .NumberString = n.slice(input, i) },
2219 error.InvalidCharacter => |err| return err,
2220 },
2221 }
22092222 else
22102223 Value{ .Float = try std.fmt.parseFloat(f64, n.slice(input, i)) };
22112224 }
......@@ -2293,7 +2306,8 @@ test "json.parser.dynamic" {
22932306 \\ "Animated" : false,
22942307 \\ "IDs": [116, 943, 234, 38793],
22952308 \\ "ArrayOfObject": [{"n": "m"}],
2296 \\ "double": 1.3412
2309 \\ "double": 1.3412,
2310 \\ "LargeInt": 18446744073709551615
22972311 \\ }
22982312 \\}
22992313 ;
......@@ -2325,6 +2339,9 @@ test "json.parser.dynamic" {
23252339
23262340 const double = image.Object.get("double").?;
23272341 testing.expect(double.Float == 1.3412);
2342
2343 const large_int = image.Object.get("LargeInt").?;
2344 testing.expect(mem.eql(u8, large_int.NumberString, "18446744073709551615"));
23282345}
23292346
23302347test "import more json tests" {