aboutsummaryrefslogtreecommitdiff
path: root/lib/std/json.zig
diff options
context:
space:
mode:
authorSebastian Keller <sebastiankeller@fastmail.net>2019-10-28 21:33:40 +0100
committerAndrew Kelley <andrew@ziglang.org>2019-11-06 18:21:52 -0500
commitf81f36e2ff348b83ace8ccb4ffd949f3d7c266c9 (patch)
treec7f8cf1f61b0727ce95a0d8babc1b2e949f0a09d /lib/std/json.zig
parentac6f0d245db4fece8982095825394586bd9a50e6 (diff)
downloadzig-f81f36e2ff348b83ace8ccb4ffd949f3d7c266c9.tar.gz
zig-f81f36e2ff348b83ace8ccb4ffd949f3d7c266c9.zip
std.json.Value: added dumpStream(), utilize WriteStream for dump()
Diffstat (limited to 'lib/std/json.zig')
-rw-r--r--lib/std/json.zig126
1 files changed, 23 insertions, 103 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig
index e126f103ae..6cd032806e 100644
--- a/lib/std/json.zig
+++ b/lib/std/json.zig
@@ -1012,119 +1012,39 @@ pub const Value = union(enum) {
Object: ObjectMap,
pub fn dump(self: Value) void {
- switch (self) {
- Value.Null => {
- debug.warn("null");
- },
- Value.Bool => |inner| {
- debug.warn("{}", inner);
- },
- Value.Integer => |inner| {
- debug.warn("{}", inner);
- },
- Value.Float => |inner| {
- debug.warn("{:.5}", inner);
- },
- Value.String => |inner| {
- debug.warn("\"{}\"", inner);
- },
- Value.Array => |inner| {
- var not_first = false;
- debug.warn("[");
- for (inner.toSliceConst()) |value| {
- if (not_first) {
- debug.warn(",");
- }
- not_first = true;
- value.dump();
- }
- debug.warn("]");
- },
- Value.Object => |inner| {
- var not_first = false;
- debug.warn("{{");
- var it = inner.iterator();
-
- while (it.next()) |entry| {
- if (not_first) {
- debug.warn(",");
- }
- not_first = true;
- debug.warn("\"{}\":", entry.key);
- entry.value.dump();
- }
- debug.warn("}}");
- },
- }
+ var held = std.debug.getStderrMutex().acquire();
+ defer held.release();
+
+ const stderr = std.debug.getStderrStream() catch return;
+ self.dumpStream(stderr, 1024) catch return;
}
- pub fn dumpIndent(self: Value, indent: usize) void {
+ pub fn dumpIndent(self: Value, comptime indent: usize) void {
if (indent == 0) {
self.dump();
} else {
- self.dumpIndentLevel(indent, 0);
+ var held = std.debug.getStderrMutex().acquire();
+ defer held.release();
+
+ const stderr = std.debug.getStderrStream() catch return;
+ self.dumpStreamIndent(indent, stderr, 1024) catch return;
}
}
- fn dumpIndentLevel(self: Value, indent: usize, level: usize) void {
- switch (self) {
- Value.Null => {
- debug.warn("null");
- },
- Value.Bool => |inner| {
- debug.warn("{}", inner);
- },
- Value.Integer => |inner| {
- debug.warn("{}", inner);
- },
- Value.Float => |inner| {
- debug.warn("{:.5}", inner);
- },
- Value.String => |inner| {
- debug.warn("\"{}\"", inner);
- },
- Value.Array => |inner| {
- var not_first = false;
- debug.warn("[\n");
-
- for (inner.toSliceConst()) |value| {
- if (not_first) {
- debug.warn(",\n");
- }
- not_first = true;
- padSpace(level + indent);
- value.dumpIndentLevel(indent, level + indent);
- }
- debug.warn("\n");
- padSpace(level);
- debug.warn("]");
- },
- Value.Object => |inner| {
- var not_first = false;
- debug.warn("{{\n");
- var it = inner.iterator();
-
- while (it.next()) |entry| {
- if (not_first) {
- debug.warn(",\n");
- }
- not_first = true;
- padSpace(level + indent);
- debug.warn("\"{}\": ", entry.key);
- entry.value.dumpIndentLevel(indent, level + indent);
- }
- debug.warn("\n");
- padSpace(level);
- debug.warn("}}");
- },
- }
+ pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void {
+ var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
+ w.newline = "";
+ w.one_indent = "";
+ w.space = "";
+ try w.emitJson(self);
}
- fn padSpace(indent: usize) void {
- var i: usize = 0;
- while (i < indent) : (i += 1) {
- debug.warn(" ");
- }
+ pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void {
+ var one_indent = " " ** indent;
+
+ var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
+ w.one_indent = one_indent;
+ try w.emitJson(self);
}
};