authorgravatar for sebastiankeller@fastmail.netSebastian Keller <sebastiankeller@fastmail.net> 2019-10-28 21:33:40+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-06 18:21:52-05:00
logf81f36e2ff348b83ace8ccb4ffd949f3d7c266c9
treec7f8cf1f61b0727ce95a0d8babc1b2e949f0a09d
parentac6f0d245db4fece8982095825394586bd9a50e6

std.json.Value: added dumpStream(), utilize WriteStream for dump()


3 files changed, 33 insertions(+), 104 deletions(-)

lib/std/debug.zig+5
......@@ -45,6 +45,7 @@ var stderr_file_out_stream: File.OutStream = undefined;
4545
4646var stderr_stream: ?*io.OutStream(File.WriteError) = null;
4747var stderr_mutex = std.Mutex.init();
48
4849pub fn warn(comptime fmt: []const u8, args: ...) void {
4950 const held = stderr_mutex.acquire();
5051 defer held.release();
......@@ -64,6 +65,10 @@ pub fn getStderrStream() !*io.OutStream(File.WriteError) {
6465 }
6566}
6667
68pub fn getStderrMutex() *std.Mutex {
69 return &stderr_mutex;
70}
71
6772/// TODO multithreaded awareness
6873var self_debug_info: ?DebugInfo = null;
6974
lib/std/json.zig+23-103
......@@ -1012,119 +1012,39 @@ pub const Value = union(enum) {
10121012 Object: ObjectMap,
10131013
10141014 pub fn dump(self: Value) void {
1015 switch (self) {
1016 Value.Null => {
1017 debug.warn("null");
1018 },
1019 Value.Bool => |inner| {
1020 debug.warn("{}", inner);
1021 },
1022 Value.Integer => |inner| {
1023 debug.warn("{}", inner);
1024 },
1025 Value.Float => |inner| {
1026 debug.warn("{:.5}", inner);
1027 },
1028 Value.String => |inner| {
1029 debug.warn("\"{}\"", inner);
1030 },
1031 Value.Array => |inner| {
1032 var not_first = false;
1033 debug.warn("[");
1034 for (inner.toSliceConst()) |value| {
1035 if (not_first) {
1036 debug.warn(",");
1037 }
1038 not_first = true;
1039 value.dump();
1040 }
1041 debug.warn("]");
1042 },
1043 Value.Object => |inner| {
1044 var not_first = false;
1045 debug.warn("{{");
1046 var it = inner.iterator();
1047
1048 while (it.next()) |entry| {
1049 if (not_first) {
1050 debug.warn(",");
1051 }
1052 not_first = true;
1053 debug.warn("\"{}\":", entry.key);
1054 entry.value.dump();
1055 }
1056 debug.warn("}}");
1057 },
1058 }
1015 var held = std.debug.getStderrMutex().acquire();
1016 defer held.release();
1017
1018 const stderr = std.debug.getStderrStream() catch return;
1019 self.dumpStream(stderr, 1024) catch return;
10591020 }
10601021
1061 pub fn dumpIndent(self: Value, indent: usize) void {
1022 pub fn dumpIndent(self: Value, comptime indent: usize) void {
10621023 if (indent == 0) {
10631024 self.dump();
10641025 } else {
1065 self.dumpIndentLevel(indent, 0);
1026 var held = std.debug.getStderrMutex().acquire();
1027 defer held.release();
1028
1029 const stderr = std.debug.getStderrStream() catch return;
1030 self.dumpStreamIndent(indent, stderr, 1024) catch return;
10661031 }
10671032 }
10681033
1069 fn dumpIndentLevel(self: Value, indent: usize, level: usize) void {
1070 switch (self) {
1071 Value.Null => {
1072 debug.warn("null");
1073 },
1074 Value.Bool => |inner| {
1075 debug.warn("{}", inner);
1076 },
1077 Value.Integer => |inner| {
1078 debug.warn("{}", inner);
1079 },
1080 Value.Float => |inner| {
1081 debug.warn("{:.5}", inner);
1082 },
1083 Value.String => |inner| {
1084 debug.warn("\"{}\"", inner);
1085 },
1086 Value.Array => |inner| {
1087 var not_first = false;
1088 debug.warn("[\n");
1089
1090 for (inner.toSliceConst()) |value| {
1091 if (not_first) {
1092 debug.warn(",\n");
1093 }
1094 not_first = true;
1095 padSpace(level + indent);
1096 value.dumpIndentLevel(indent, level + indent);
1097 }
1098 debug.warn("\n");
1099 padSpace(level);
1100 debug.warn("]");
1101 },
1102 Value.Object => |inner| {
1103 var not_first = false;
1104 debug.warn("{{\n");
1105 var it = inner.iterator();
1106
1107 while (it.next()) |entry| {
1108 if (not_first) {
1109 debug.warn(",\n");
1110 }
1111 not_first = true;
1112 padSpace(level + indent);
1113 debug.warn("\"{}\": ", entry.key);
1114 entry.value.dumpIndentLevel(indent, level + indent);
1115 }
1116 debug.warn("\n");
1117 padSpace(level);
1118 debug.warn("}}");
1119 },
1120 }
1034 pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void {
1035 var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
1036 w.newline = "";
1037 w.one_indent = "";
1038 w.space = "";
1039 try w.emitJson(self);
11211040 }
11221041
1123 fn padSpace(indent: usize) void {
1124 var i: usize = 0;
1125 while (i < indent) : (i += 1) {
1126 debug.warn(" ");
1127 }
1042 pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void {
1043 var one_indent = " " ** indent;
1044
1045 var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
1046 w.one_indent = one_indent;
1047 try w.emitJson(self);
11281048 }
11291049};
11301050
lib/std/json/write_stream.zig+5-1
......@@ -27,6 +27,9 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
2727 /// The string used as a newline character.
2828 newline: []const u8 = "\n",
2929
30 /// The string used as spacing.
31 space: []const u8 = " ",
32
3033 stream: *OutStream,
3134 state_index: usize,
3235 state: [max_depth]State,
......@@ -87,7 +90,8 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
8790 self.pushState(.Value);
8891 try self.indent();
8992 try self.writeEscapedString(name);
90 try self.stream.write(": ");
93 try self.stream.write(":");
94 try self.stream.write(self.space);
9195 },
9296 }
9397 }