aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jv/parse.zig
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-31 15:31:15 +0900
committernsfisis <nsfisis@gmail.com>2026-01-31 15:47:23 +0900
commit617ddc62aa4d3153850362526069b85bfaf5e59e (patch)
tree6940c577bbecdbf7856ef3c37ab43b256d33da59 /src/jv/parse.zig
parent6be43138338fbe4623c1cd62cf71138873af3a7a (diff)
downloadzgjq-617ddc62aa4d3153850362526069b85bfaf5e59e.tar.gz
zgjq-617ddc62aa4d3153850362526069b85bfaf5e59e.tar.zst
zgjq-617ddc62aa4d3153850362526069b85bfaf5e59e.zip
use reference counting to manage JSON value lifetime
Diffstat (limited to 'src/jv/parse.zig')
-rw-r--r--src/jv/parse.zig32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/jv/parse.zig b/src/jv/parse.zig
index dc3fcef..3d90be5 100644
--- a/src/jv/parse.zig
+++ b/src/jv/parse.zig
@@ -1,5 +1,7 @@
const std = @import("std");
const Value = @import("./value.zig").Value;
+const Array = @import("./value.zig").Array;
+const Object = @import("./value.zig").Object;
pub const Parsed = struct {
value: Value,
@@ -7,6 +9,7 @@ pub const Parsed = struct {
allocator: std.mem.Allocator,
pub fn deinit(self: *const Parsed) void {
+ self.value.deinit(self.allocator);
const arena = self.arena;
const allocator = self.allocator;
arena.deinit();
@@ -16,9 +19,36 @@ pub const Parsed = struct {
pub fn parse(allocator: std.mem.Allocator, input: []const u8) !Parsed {
const internal = try std.json.parseFromSlice(std.json.Value, allocator, input, .{});
+ const value = try convertValue(allocator, internal.value);
return .{
- .value = .{ ._internal = internal.value },
+ .value = value,
.arena = internal.arena,
.allocator = allocator,
};
}
+
+fn convertValue(allocator: std.mem.Allocator, v: std.json.Value) !Value {
+ return switch (v) {
+ .null => Value.null,
+ .bool => |b| Value.initBool(b),
+ .integer => |i| Value.initInteger(i),
+ .float => |f| Value.initFloat(f),
+ .string => |s| Value.initString(s),
+ .array => |a| blk: {
+ var arr = try Array.init(allocator);
+ for (a.items) |item| {
+ try arr.append(allocator, try convertValue(allocator, item));
+ }
+ break :blk Value.initArray(arr);
+ },
+ .object => |o| blk: {
+ var obj = try Object.init(allocator);
+ var it = o.iterator();
+ while (it.next()) |entry| {
+ try obj.set(allocator, entry.key_ptr.*, try convertValue(allocator, entry.value_ptr.*));
+ }
+ break :blk Value.initObject(obj);
+ },
+ .number_string => unreachable,
+ };
+}