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;...@@ -45,6 +45,7 @@ var stderr_file_out_stream: File.OutStream = undefined;
4545
46var stderr_stream: ?*io.OutStream(File.WriteError) = null;46var stderr_stream: ?*io.OutStream(File.WriteError) = null;
47var stderr_mutex = std.Mutex.init();47var stderr_mutex = std.Mutex.init();
48
48pub fn warn(comptime fmt: []const u8, args: ...) void {49pub fn warn(comptime fmt: []const u8, args: ...) void {
49 const held = stderr_mutex.acquire();50 const held = stderr_mutex.acquire();
50 defer held.release();51 defer held.release();
...@@ -64,6 +65,10 @@ pub fn getStderrStream() !*io.OutStream(File.WriteError) {...@@ -64,6 +65,10 @@ pub fn getStderrStream() !*io.OutStream(File.WriteError) {
64 }65 }
65}66}
6667
68pub fn getStderrMutex() *std.Mutex {
69 return &stderr_mutex;
70}
71
67/// TODO multithreaded awareness72/// TODO multithreaded awareness
68var self_debug_info: ?DebugInfo = null;73var self_debug_info: ?DebugInfo = null;
6974
lib/std/json.zig+23-103
...@@ -1012,119 +1012,39 @@ pub const Value = union(enum) {...@@ -1012,119 +1012,39 @@ pub const Value = union(enum) {
1012 Object: ObjectMap,1012 Object: ObjectMap,
10131013
1014 pub fn dump(self: Value) void {1014 pub fn dump(self: Value) void {
1015 switch (self) {1015 var held = std.debug.getStderrMutex().acquire();
1016 Value.Null => {1016 defer held.release();
1017 debug.warn("null");1017
1018 },1018 const stderr = std.debug.getStderrStream() catch return;
1019 Value.Bool => |inner| {1019 self.dumpStream(stderr, 1024) catch return;
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 }
1059 }1020 }
10601021
1061 pub fn dumpIndent(self: Value, indent: usize) void {1022 pub fn dumpIndent(self: Value, comptime indent: usize) void {
1062 if (indent == 0) {1023 if (indent == 0) {
1063 self.dump();1024 self.dump();
1064 } else {1025 } 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;
1066 }1031 }
1067 }1032 }
10681033
1069 fn dumpIndentLevel(self: Value, indent: usize, level: usize) void {1034 pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void {
1070 switch (self) {1035 var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
1071 Value.Null => {1036 w.newline = "";
1072 debug.warn("null");1037 w.one_indent = "";
1073 },1038 w.space = "";
1074 Value.Bool => |inner| {1039 try w.emitJson(self);
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 }
1121 }1040 }
11221041
1123 fn padSpace(indent: usize) void {1042 pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void {
1124 var i: usize = 0;1043 var one_indent = " " ** indent;
1125 while (i < indent) : (i += 1) {1044
1126 debug.warn(" ");1045 var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
1127 }1046 w.one_indent = one_indent;
1047 try w.emitJson(self);
1128 }1048 }
1129};1049};
11301050
lib/std/json/write_stream.zig+5-1
...@@ -27,6 +27,9 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {...@@ -27,6 +27,9 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
27 /// The string used as a newline character.27 /// The string used as a newline character.
28 newline: []const u8 = "\n",28 newline: []const u8 = "\n",
2929
30 /// The string used as spacing.
31 space: []const u8 = " ",
32
30 stream: *OutStream,33 stream: *OutStream,
31 state_index: usize,34 state_index: usize,
32 state: [max_depth]State,35 state: [max_depth]State,
...@@ -87,7 +90,8 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {...@@ -87,7 +90,8 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
87 self.pushState(.Value);90 self.pushState(.Value);
88 try self.indent();91 try self.indent();
89 try self.writeEscapedString(name);92 try self.writeEscapedString(name);
90 try self.stream.write(": ");93 try self.stream.write(":");
94 try self.stream.write(self.space);
91 },95 },
92 }96 }
93 }97 }