| ... | ... | @@ -743,17 +743,13 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.Stringify.Op |
| 743 | 743 | try writer.writeAll("\""); |
| 744 | 744 | } |
| 745 | 745 | } else { |
| 746 | | return error.Unexpected; |
| 747 | | } |
| 748 | | return; |
| 749 | | } |
| 750 | | if (comptime extras.isArrayOf(u8)(T)) { |
| 751 | | if (extras.matchesAll(u8, &value, std.ascii.isAscii)) { |
| 752 | | if (extras.matchesAll(u8, &value, std.ascii.isPrint)) { |
| 753 | | try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} }); |
| 754 | | } else { |
| 755 | | try writer.writeAll("\""); |
| 756 | | for (&value) |c| { |
| 746 | var view = std.unicode.Utf8View.init(value) catch return error.Unexpected; |
| 747 | var iter = view.iterator(); |
| 748 | try writer.writeAll("\""); |
| 749 | while (iter.nextCodepointSlice()) |sl| { |
| 750 | const cp = std.unicode.utf8Decode(sl) catch unreachable; |
| 751 | if (cp < 128) { |
| 752 | const c: u8 = @intCast(cp); |
| 757 | 753 | try writer.writeAll(switch (c) { |
| 758 | 754 | 0x08 => "\\b", |
| 759 | 755 | 0x09 => "\\t", |
| ... | ... | @@ -765,14 +761,18 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.Stringify.Op |
| 765 | 761 | 0x23...0x7e => &.{c}, |
| 766 | 762 | else => "\\u00" ++ extras.to_hex([_]u8{c}), |
| 767 | 763 | }); |
| 764 | continue; |
| 768 | 765 | } |
| 769 | | try writer.writeAll("\""); |
| 766 | try writer.writeAll(sl); |
| 770 | 767 | } |
| 771 | | } else { |
| 772 | | return error.Unexpected; |
| 768 | try writer.writeAll("\""); |
| 769 | return; |
| 773 | 770 | } |
| 774 | 771 | return; |
| 775 | 772 | } |
| 773 | if (comptime extras.isArrayOf(u8)(T)) { |
| 774 | return stringify(writer, &value, options); |
| 775 | } |
| 776 | 776 | if (comptime extras.isSlice(T)) { |
| 777 | 777 | try writer.writeAll("["); |
| 778 | 778 | for (value, 0..) |item, i| { |