| ... | @@ -867,6 +867,8 @@ pub const TokenStream = struct { | ... | @@ -867,6 +867,8 @@ pub const TokenStream = struct { |
| 867 | parser: StreamingParser, | 867 | parser: StreamingParser, |
| 868 | token: ?Token, | 868 | token: ?Token, |
| 869 | | 869 | |
| | 870 | pub const Error = StreamingParser.Error || error.Incomplete; |
| | 871 | |
| 870 | pub fn init(slice: []const u8) TokenStream { | 872 | pub fn init(slice: []const u8) TokenStream { |
| 871 | return TokenStream{ | 873 | return TokenStream{ |
| 872 | .i = 0, | 874 | .i = 0, |
| ... | @@ -896,16 +898,11 @@ pub const TokenStream = struct { | ... | @@ -896,16 +898,11 @@ pub const TokenStream = struct { |
| 896 | } | 898 | } |
| 897 | } | 899 | } |
| 898 | | 900 | |
| 899 | if (self.i > self.slice.len) { | 901 | if(self.parser.complete){ |
| 900 | try self.parser.feed(' ', &t1, &t2); | 902 | return null; |
| 901 | self.i += 1; | 903 | } else { |
| 902 | | 904 | return error.Incomplete; |
| 903 | if (t1) |token| { | | |
| 904 | return token; | | |
| 905 | } | | |
| 906 | } | 905 | } |
| 907 | | | |
| 908 | return null; | | |
| 909 | } | 906 | } |
| 910 | }; | 907 | }; |
| 911 | | 908 | |
| ... | @@ -1455,3 +1452,9 @@ test "write json then parse it" { | ... | @@ -1455,3 +1452,9 @@ test "write json then parse it" { |
| 1455 | testing.expect(tree.root.Object.get("array").?.value.Array.at(1).Float == 12.34); | 1452 | testing.expect(tree.root.Object.get("array").?.value.Array.at(1).Float == 12.34); |
| 1456 | testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello")); | 1453 | testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello")); |
| 1457 | } | 1454 | } |
| | 1455 | |
| | 1456 | test "parsing empty string does not crash" { |
| | 1457 | var p = Parser.init(debug.global_allocator, false); |
| | 1458 | defer p.deinit(); |
| | 1459 | testing.expectError(error.Incomplete, p.parse("")); |
| | 1460 | } |