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

This commit is contained in:
Sebastian Keller 2019-10-28 21:33:40 +01:00 committed by Andrew Kelley
parent ac6f0d245d
commit f81f36e2ff
3 changed files with 32 additions and 103 deletions

View File

@ -45,6 +45,7 @@ var stderr_file_out_stream: File.OutStream = undefined;
var stderr_stream: ?*io.OutStream(File.WriteError) = null;
var stderr_mutex = std.Mutex.init();
pub fn warn(comptime fmt: []const u8, args: ...) void {
const held = stderr_mutex.acquire();
defer held.release();
@ -64,6 +65,10 @@ pub fn getStderrStream() !*io.OutStream(File.WriteError) {
}
}
pub fn getStderrMutex() *std.Mutex {
return &stderr_mutex;
}
/// TODO multithreaded awareness
var self_debug_info: ?DebugInfo = null;

View File

@ -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();
var held = std.debug.getStderrMutex().acquire();
defer held.release();
while (it.next()) |entry| {
if (not_first) {
debug.warn(",");
}
not_first = true;
debug.warn("\"{}\":", entry.key);
entry.value.dump();
}
debug.warn("}}");
},
}
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);
}
};

View File

@ -27,6 +27,9 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
/// The string used as a newline character.
newline: []const u8 = "\n",
/// The string used as spacing.
space: []const u8 = " ",
stream: *OutStream,
state_index: usize,
state: [max_depth]State,
@ -87,7 +90,8 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
self.pushState(.Value);
try self.indent();
try self.writeEscapedString(name);
try self.stream.write(": ");
try self.stream.write(":");
try self.stream.write(self.space);
},
}
}