lib/pretty/core/src/json/field.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const escape = @import("escape.zig");
 3 const scalar = @import("scalar.zig");
 4 
 5 pub const Field = struct {
 6     first: bool = false,
 7 };
 8 
 9 pub fn writeFieldName(writer: anytype, name: []const u8, field: Field) !void {
10     if (!field.first) try writer.writeByte(',');
11     try escape.writeString(writer, name);
12     try writer.writeByte(':');
13 }
14 
15 pub fn writeFieldString(writer: anytype, name: []const u8, value: []const u8, field: Field) !void {
16     try writeFieldName(writer, name, field);
17     try escape.writeString(writer, value);
18 }
19 
20 pub fn writeFieldOptionalString(writer: anytype, name: []const u8, value: ?[]const u8, field: Field) !void {
21     try writeFieldName(writer, name, field);
22     if (value) |inner| try escape.writeString(writer, inner) else try scalar.writeNull(writer);
23 }
24 
25 pub fn writeFieldBool(writer: anytype, name: []const u8, value: bool, field: Field) !void {
26     try writeFieldName(writer, name, field);
27     try scalar.writeBool(writer, value);
28 }
29 
30 pub fn writeFieldInt(writer: anytype, name: []const u8, value: anytype, field: Field) !void {
31     try writeFieldName(writer, name, field);
32     try scalar.writeInt(writer, value);
33 }
34 
35 pub fn writeFieldRaw(writer: anytype, name: []const u8, raw_json: []const u8, field: Field) !void {
36     try writeFieldName(writer, name, field);
37     try writer.writeAll(raw_json);
38 }
39 
40 test "field helpers write compact object fields" {
41     var out = std.Io.Writer.Allocating.init(std.testing.allocator);
42     defer out.deinit();
43     try out.writer.writeByte('{');
44     try writeFieldString(&out.writer, "name", "alpha", .{ .first = true });
45     try writeFieldInt(&out.writer, "count", @as(i64, 42), .{});
46     try writeFieldBool(&out.writer, "ok", true, .{});
47     try writeFieldOptionalString(&out.writer, "none", null, .{});
48     try out.writer.writeByte('}');
49     const rendered = try out.toOwnedSlice();
50     defer std.testing.allocator.free(rendered);
51     try std.testing.expectEqualStrings("{\"name\":\"alpha\",\"count\":42,\"ok\":true,\"none\":null}", rendered);
52 }