authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-03-13 19:42:20 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-03-13 19:42:20 -07:00
logc53591303599ccf2f676adfaa9c7b6a16204fd98
tree7589398e5c1f09984d5d970fb06ffbda72c61244
parent5ed385991441fbf60d59f67fc374e00adfc4a433
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add stringify


1 files changed, 45 insertions(+), 0 deletions(-)

json.zig+45
......@@ -720,3 +720,48 @@ const Space = union(enum) {
720720 };
721721 }
722722};
723
724pub fn stringify(writer: anytype, value: anytype, options: std.json.StringifyOptions) extras.Pointee(@TypeOf(writer)).WriteError!void {
725 const T = @TypeOf(value);
726 if (comptime extras.isZigString(T)) {
727 if (extras.matchesAll(u8, value, std.ascii.isAscii)) {
728 try writer.writevAll(&.{ &.{'"'}, value, &.{'"'} });
729 } else {
730 @panic("TODO");
731 }
732 return;
733 }
734 if (comptime extras.isArrayOf(u8)(T)) {
735 if (extras.matchesAll(u8, &value, std.ascii.isAscii)) {
736 try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} });
737 } else {
738 @panic("TODO");
739 }
740 return;
741 }
742 switch (@typeInfo(T)) {
743 .@"struct" => |info| {
744 try writer.writeAll("{");
745 inline for (info.fields, 0..) |field, i| blk: {
746 const field_value = @field(value, field.name);
747 if (@typeInfo(field.type) == .optional and field_value == null and !options.emit_null_optional_fields) break :blk;
748 if (i > 0) try writer.writeAll(",");
749 try stringify(writer, field.name, options);
750 try writer.writeAll(":");
751 try stringify(writer, field_value, options);
752 }
753 try writer.writeAll("}");
754 },
755 .comptime_int => {
756 return nio.fmt.formatInt(value, 10, .lower, .{}, writer);
757 },
758 .optional => {
759 if (value) |v| {
760 try stringify(writer, v, options);
761 } else {
762 try writer.writeAll("null");
763 }
764 },
765 else => @compileError(@typeName(T)),
766 }
767}