| ... | ... | @@ -1551,8 +1551,11 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: |
| 1551 | 1551 | .Number => |n| n, |
| 1552 | 1552 | else => return error.UnexpectedToken, |
| 1553 | 1553 | }; |
| 1554 | | if (!numberToken.is_integer) return error.UnexpectedToken; |
| 1555 | | return try std.fmt.parseInt(T, numberToken.slice(tokens.slice, tokens.i - 1), 10); |
| 1554 | if (numberToken.is_integer) |
| 1555 | return try std.fmt.parseInt(T, numberToken.slice(tokens.slice, tokens.i - 1), 10); |
| 1556 | const float = try std.fmt.parseFloat(f128, numberToken.slice(tokens.slice, tokens.i - 1)); |
| 1557 | if (std.math.round(float) != float) return error.InvalidNumber; |
| 1558 | return @floatToInt(T, float); |
| 1556 | 1559 | }, |
| 1557 | 1560 | .Optional => |optionalInfo| { |
| 1558 | 1561 | if (token == .Null) { |
| ... | ... | @@ -2122,8 +2125,8 @@ test "parse into struct with duplicate field" { |
| 2122 | 2125 | |
| 2123 | 2126 | const T1 = struct { a: *u64 }; |
| 2124 | 2127 | // both .UseFirst and .UseLast should fail because second "a" value isn't a u64 |
| 2125 | | try testing.expectError(error.UnexpectedToken, parse(T1, &TokenStream.init(str), options_first)); |
| 2126 | | try testing.expectError(error.UnexpectedToken, parse(T1, &TokenStream.init(str), options_last)); |
| 2128 | try testing.expectError(error.InvalidNumber, parse(T1, &TokenStream.init(str), options_first)); |
| 2129 | try testing.expectError(error.InvalidNumber, parse(T1, &TokenStream.init(str), options_last)); |
| 2127 | 2130 | |
| 2128 | 2131 | const T2 = struct { a: f64 }; |
| 2129 | 2132 | try testing.expectEqual(T2{ .a = 1.0 }, try parse(T2, &TokenStream.init(str), options_first)); |
| ... | ... | @@ -2609,6 +2612,13 @@ test "integer after float has proper type" { |
| 2609 | 2612 | try std.testing.expect(json.Object.get("ints").?.Array.items[0] == .Integer); |
| 2610 | 2613 | } |
| 2611 | 2614 | |
| 2615 | test "parse exponential into int" { |
| 2616 | const T = struct { int: i64 }; |
| 2617 | const r = try parse(T, &TokenStream.init("{ \"int\": 4.2e2 }"), ParseOptions{}); |
| 2618 | try testing.expectEqual(@as(i64, 420), r.int); |
| 2619 | try testing.expectError(error.InvalidNumber, parse(T, &TokenStream.init("{ \"int\": 0.042e2 }"), ParseOptions{})); |
| 2620 | } |
| 2621 | |
| 2612 | 2622 | test "escaped characters" { |
| 2613 | 2623 | var arena_allocator = std.heap.ArenaAllocator.init(std.testing.allocator); |
| 2614 | 2624 | defer arena_allocator.deinit(); |