diff --git a/json.zig b/json.zig index 490ee0f97c1deda7bd5d675880551f9a9913664c..82e03a59bbf5f2a8612b512ddf4c0023b498655f 100644 --- a/json.zig +++ b/json.zig @@ -3,20 +3,21 @@ const string = []const u8; const extras = @import("extras"); const tracer = @import("tracer"); const intrusive_parser = @import("intrusive-parser"); +const nio = @import("nio"); pub const Error = error{ OutOfMemory, EndOfStream, MalformedJson }; pub const ObjectHashMap = std.AutoArrayHashMapUnmanaged(StringIndex, ValueIndex); -pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype, options: Parser.Options) (@TypeOf(inreader).Error || Error)!Document { +pub fn parse(alloc: std.mem.Allocator, path: string, inreadable: anytype, options: Parser.Options) (Instance(@TypeOf(inreadable)).ReadError || Error)!Document { const t = tracer.trace(@src(), "", .{}); defer t.end(); _ = path; - var p = try Parser.init(alloc, inreader.any(), options); + var p = try Parser.init(alloc, inreadable.anyReadable(), options); defer p.deinit(); - const root = try parseElementPrecise(alloc, &p, @TypeOf(inreader).Error || Error); + const root = try parseElementPrecise(alloc, &p, Instance(@TypeOf(inreadable)).ReadError || Error); if (p.parser.avail() > 0) return error.MalformedJson; const data = try p.parser.data.toOwnedSlice(alloc); @@ -26,9 +27,16 @@ pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype, options: }; } +fn Instance(T: type) type { + return switch (@typeInfo(T)) { + .pointer => |info| info.child, + else => T, + }; +} + pub fn parseFromSlice(alloc: std.mem.Allocator, path: string, input: string, options: Parser.Options) !Document { - var fbs = std.io.fixedBufferStream(input); - return parse(alloc, path, fbs.reader(), options); + var fbs: nio.FixedBufferStream(string) = .init(input); + return parse(alloc, path, &fbs, options); } fn parseElementPrecise(alloc: std.mem.Allocator, p: *Parser, comptime E: type) E!ValueIndex { @@ -253,7 +261,7 @@ pub const Parser = struct { support_trailing_commas: bool, maximum_depth: u16, - pub fn init(allocator: std.mem.Allocator, any: std.io.AnyReader, options: Options) !Parser { + pub fn init(allocator: std.mem.Allocator, any: nio.AnyReadable, options: Options) !Parser { var p: Parser = .{ .parser = intrusive_parser.Parser.init(allocator, any, @intFromEnum(Value.Tag.string)), .support_trailing_commas = options.support_trailing_commas, diff --git a/licenses.txt b/licenses.txt index f415640d57e86e1738bc259f0f6704ad7b3697ad..7e7cebea43063578ffec120d3211b0e5976b0302 100644 --- a/licenses.txt +++ b/licenses.txt @@ -1,10 +1,18 @@ MIT: = https://spdx.org/licenses/MIT - This +- git https://github.com/nektro/zig-errno - git https://github.com/nektro/zig-extras +- git https://github.com/nektro/zig-libc +- git https://github.com/nektro/zig-sys-libc - git https://github.com/nektro/zig-tracer - git https://github.com/nst/JSONTestSuite MPL-2.0: = https://spdx.org/licenses/MPL-2.0 - git https://github.com/nektro/zig-intrusive-parser +- git https://github.com/nektro/zig-nfs +- git https://github.com/nektro/zig-nio + +Unspecified: +- system_lib c diff --git a/test.zig b/test.zig index 417cbf2125442c6ecfe6f9bbbfd2773134de3a80..136eebf871e6267421133b9e9e2adca7dc362da8 100644 --- a/test.zig +++ b/test.zig @@ -1,12 +1,15 @@ const std = @import("std"); const json = @import("json"); const build_options = @import("build_options"); +const nfs = @import("nfs"); +const nio = @import("nio"); + const JSONTestSuite_root = build_options.JSONTestSuite_root; fn parse_full(buffer: []const u8) !void { const alloc = std.testing.allocator; - var fbs = std.io.fixedBufferStream(buffer); - var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 }); + var fbs: nio.FixedBufferStream([]const u8) = .init(buffer); + var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 }); defer doc.deinit(alloc); } @@ -260,11 +263,11 @@ test { ); } -fn expectPass(path: []const u8) !void { +fn expectPass(path: [:0]const u8) !void { const alloc = std.testing.allocator; - var file = try std.fs.cwd().openFile(path, .{}); + const file = try nfs.cwd().openFile(path, .{}); defer file.close(); - var doc = try json.parse(alloc, path, file.reader(), .{ .support_trailing_commas = false, .maximum_depth = 100 }); + var doc = try json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 }); defer doc.deinit(alloc); } @@ -366,11 +369,11 @@ test { try expectPass(JSONTestSuite_root ++ "/y_structure_true_in_array.json"); test { try expectPass(JSONTestSuite_root ++ "/y_structure_whitespace_array.json"); } // zig fmt: on -fn expectFail(path: []const u8) !void { +fn expectFail(path: [:0]const u8) !void { const alloc = std.testing.allocator; - var file = try std.fs.cwd().openFile(path, .{}); + const file = try nfs.cwd().openFile(path, .{}); defer file.close(); - var doc = json.parse(alloc, path, file.reader(), .{ .support_trailing_commas = false, .maximum_depth = 100 }) catch return; + var doc = json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 }) catch return; defer doc.deinit(alloc); try std.testing.expect(false); } @@ -568,8 +571,8 @@ test { try expectFail(JSONTestSuite_root ++ "/n_structure_whitespace_U+2060_word fn expectCanonical(buffer: []const u8) !void { const alloc = std.testing.allocator; - var fbs = std.io.fixedBufferStream(buffer); - var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 }); + var fbs: nio.FixedBufferStream([]const u8) = .init(buffer); + var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 }); defer doc.deinit(alloc); doc.acquire(); defer doc.release(); @@ -589,10 +592,10 @@ test { try expectCanonical("[7,8,9]"); } test { const alloc = std.testing.allocator; - var fbs = std.io.fixedBufferStream( + var fbs: nio.FixedBufferStream([]const u8) = .init( \\["abc",456,"ghi",{"foo":"bar"}] ); - var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 }); + var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 }); defer doc.deinit(alloc); doc.acquire(); defer doc.release(); diff --git a/zig.mod b/zig.mod index 98d91ebac3b175c9e1e79641748f42a45da7071e..a5d8b52c51b189fcb237c2f92ec4cd2480394518 100644 --- a/zig.mod +++ b/zig.mod @@ -7,8 +7,11 @@ dependencies: - src: git https://github.com/nektro/zig-extras - src: git https://github.com/nektro/zig-tracer - src: git https://github.com/nektro/zig-intrusive-parser + - src: git https://github.com/nektro/zig-nio root_dependencies: + - src: git https://github.com/nektro/zig-nio + - src: git https://github.com/nektro/zig-nfs - src: git https://github.com/nst/JSONTestSuite commit-984defc2deaa653cb73cd29f4144a720ec9efe7c id: bebdygynna6kk8zbbprkva6yd28x9wmf57vtzxjn license: MIT