authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-08-24 02:37:00 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-08-24 02:37:00 -07:00
logb8b264d1de2ce1421d815cbc05cf8a662e627b3b
tree45b1e30a9b4797d4885ab845e003fd534ef7f373
parent02fb7045dc16c791436f7f4127c8a072e7acdff8

start using nio and nfs


4 files changed, 40 insertions(+), 18 deletions(-)

json.zig+14-6
......@@ -3,20 +3,21 @@ const string = []const u8;
33const extras = @import("extras");
44const tracer = @import("tracer");
55const intrusive_parser = @import("intrusive-parser");
6const nio = @import("nio");
67
78pub const Error = error{ OutOfMemory, EndOfStream, MalformedJson };
89pub const ObjectHashMap = std.AutoArrayHashMapUnmanaged(StringIndex, ValueIndex);
910
10pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype, options: Parser.Options) (@TypeOf(inreader).Error || Error)!Document {
11pub fn parse(alloc: std.mem.Allocator, path: string, inreadable: anytype, options: Parser.Options) (Instance(@TypeOf(inreadable)).ReadError || Error)!Document {
1112 const t = tracer.trace(@src(), "", .{});
1213 defer t.end();
1314
1415 _ = path;
1516
16 var p = try Parser.init(alloc, inreader.any(), options);
17 var p = try Parser.init(alloc, inreadable.anyReadable(), options);
1718 defer p.deinit();
1819
19 const root = try parseElementPrecise(alloc, &p, @TypeOf(inreader).Error || Error);
20 const root = try parseElementPrecise(alloc, &p, Instance(@TypeOf(inreadable)).ReadError || Error);
2021 if (p.parser.avail() > 0) return error.MalformedJson;
2122 const data = try p.parser.data.toOwnedSlice(alloc);
2223
......@@ -26,9 +27,16 @@ pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype, options:
2627 };
2728}
2829
30fn Instance(T: type) type {
31 return switch (@typeInfo(T)) {
32 .pointer => |info| info.child,
33 else => T,
34 };
35}
36
2937pub fn parseFromSlice(alloc: std.mem.Allocator, path: string, input: string, options: Parser.Options) !Document {
30 var fbs = std.io.fixedBufferStream(input);
31 return parse(alloc, path, fbs.reader(), options);
38 var fbs: nio.FixedBufferStream(string) = .init(input);
39 return parse(alloc, path, &fbs, options);
3240}
3341
3442fn parseElementPrecise(alloc: std.mem.Allocator, p: *Parser, comptime E: type) E!ValueIndex {
......@@ -253,7 +261,7 @@ pub const Parser = struct {
253261 support_trailing_commas: bool,
254262 maximum_depth: u16,
255263
256 pub fn init(allocator: std.mem.Allocator, any: std.io.AnyReader, options: Options) !Parser {
264 pub fn init(allocator: std.mem.Allocator, any: nio.AnyReadable, options: Options) !Parser {
257265 var p: Parser = .{
258266 .parser = intrusive_parser.Parser.init(allocator, any, @intFromEnum(Value.Tag.string)),
259267 .support_trailing_commas = options.support_trailing_commas,
licenses.txt+8
......@@ -1,10 +1,18 @@
11MIT:
22= https://spdx.org/licenses/MIT
33- This
4- git https://github.com/nektro/zig-errno
45- git https://github.com/nektro/zig-extras
6- git https://github.com/nektro/zig-libc
7- git https://github.com/nektro/zig-sys-libc
58- git https://github.com/nektro/zig-tracer
69- git https://github.com/nst/JSONTestSuite
710
811MPL-2.0:
912= https://spdx.org/licenses/MPL-2.0
1013- git https://github.com/nektro/zig-intrusive-parser
14- git https://github.com/nektro/zig-nfs
15- git https://github.com/nektro/zig-nio
16
17Unspecified:
18- system_lib c
test.zig+15-12
......@@ -1,12 +1,15 @@
11const std = @import("std");
22const json = @import("json");
33const build_options = @import("build_options");
4const nfs = @import("nfs");
5const nio = @import("nio");
6
47const JSONTestSuite_root = build_options.JSONTestSuite_root;
58
69fn parse_full(buffer: []const u8) !void {
710 const alloc = std.testing.allocator;
8 var fbs = std.io.fixedBufferStream(buffer);
9 var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 });
11 var fbs: nio.FixedBufferStream([]const u8) = .init(buffer);
12 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
1013 defer doc.deinit(alloc);
1114}
1215
......@@ -260,11 +263,11 @@ test {
260263 );
261264}
262265
263fn expectPass(path: []const u8) !void {
266fn expectPass(path: [:0]const u8) !void {
264267 const alloc = std.testing.allocator;
265 var file = try std.fs.cwd().openFile(path, .{});
268 const file = try nfs.cwd().openFile(path, .{});
266269 defer file.close();
267 var doc = try json.parse(alloc, path, file.reader(), .{ .support_trailing_commas = false, .maximum_depth = 100 });
270 var doc = try json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 });
268271 defer doc.deinit(alloc);
269272}
270273
......@@ -366,11 +369,11 @@ test { try expectPass(JSONTestSuite_root ++ "/y_structure_true_in_array.json");
366369test { try expectPass(JSONTestSuite_root ++ "/y_structure_whitespace_array.json"); }
367370// zig fmt: on
368371
369fn expectFail(path: []const u8) !void {
372fn expectFail(path: [:0]const u8) !void {
370373 const alloc = std.testing.allocator;
371 var file = try std.fs.cwd().openFile(path, .{});
374 const file = try nfs.cwd().openFile(path, .{});
372375 defer file.close();
373 var doc = json.parse(alloc, path, file.reader(), .{ .support_trailing_commas = false, .maximum_depth = 100 }) catch return;
376 var doc = json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 }) catch return;
374377 defer doc.deinit(alloc);
375378 try std.testing.expect(false);
376379}
......@@ -568,8 +571,8 @@ test { try expectFail(JSONTestSuite_root ++ "/n_structure_whitespace_U+2060_word
568571
569572fn expectCanonical(buffer: []const u8) !void {
570573 const alloc = std.testing.allocator;
571 var fbs = std.io.fixedBufferStream(buffer);
572 var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 });
574 var fbs: nio.FixedBufferStream([]const u8) = .init(buffer);
575 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
573576 defer doc.deinit(alloc);
574577 doc.acquire();
575578 defer doc.release();
......@@ -589,10 +592,10 @@ test { try expectCanonical("[7,8,9]"); }
589592
590593test {
591594 const alloc = std.testing.allocator;
592 var fbs = std.io.fixedBufferStream(
595 var fbs: nio.FixedBufferStream([]const u8) = .init(
593596 \\["abc",456,"ghi",{"foo":"bar"}]
594597 );
595 var doc = try json.parse(alloc, "", fbs.reader(), .{ .support_trailing_commas = true, .maximum_depth = 100 });
598 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
596599 defer doc.deinit(alloc);
597600 doc.acquire();
598601 defer doc.release();
zig.mod+3
......@@ -7,8 +7,11 @@ dependencies:
77 - src: git https://github.com/nektro/zig-extras
88 - src: git https://github.com/nektro/zig-tracer
99 - src: git https://github.com/nektro/zig-intrusive-parser
10 - src: git https://github.com/nektro/zig-nio
1011
1112root_dependencies:
13 - src: git https://github.com/nektro/zig-nio
14 - src: git https://github.com/nektro/zig-nfs
1215 - src: git https://github.com/nst/JSONTestSuite commit-984defc2deaa653cb73cd29f4144a720ec9efe7c
1316 id: bebdygynna6kk8zbbprkva6yd28x9wmf57vtzxjn
1417 license: MIT