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 }