mirror of
https://github.com/ziglang/zig.git
synced 2025-12-16 19:23:08 +00:00
std.json.Value: added dumpStream(), utilize WriteStream for dump()
This commit is contained in:
parent
ac6f0d245d
commit
f81f36e2ff
@ -45,6 +45,7 @@ var stderr_file_out_stream: File.OutStream = undefined;
|
|||||||
|
|
||||||
var stderr_stream: ?*io.OutStream(File.WriteError) = null;
|
var stderr_stream: ?*io.OutStream(File.WriteError) = null;
|
||||||
var stderr_mutex = std.Mutex.init();
|
var stderr_mutex = std.Mutex.init();
|
||||||
|
|
||||||
pub fn warn(comptime fmt: []const u8, args: ...) void {
|
pub fn warn(comptime fmt: []const u8, args: ...) void {
|
||||||
const held = stderr_mutex.acquire();
|
const held = stderr_mutex.acquire();
|
||||||
defer held.release();
|
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
|
/// TODO multithreaded awareness
|
||||||
var self_debug_info: ?DebugInfo = null;
|
var self_debug_info: ?DebugInfo = null;
|
||||||
|
|
||||||
|
|||||||
124
lib/std/json.zig
124
lib/std/json.zig
@ -1012,119 +1012,39 @@ pub const Value = union(enum) {
|
|||||||
Object: ObjectMap,
|
Object: ObjectMap,
|
||||||
|
|
||||||
pub fn dump(self: Value) void {
|
pub fn dump(self: Value) void {
|
||||||
switch (self) {
|
var held = std.debug.getStderrMutex().acquire();
|
||||||
Value.Null => {
|
defer held.release();
|
||||||
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| {
|
const stderr = std.debug.getStderrStream() catch return;
|
||||||
if (not_first) {
|
self.dumpStream(stderr, 1024) catch return;
|
||||||
debug.warn(",");
|
|
||||||
}
|
|
||||||
not_first = true;
|
|
||||||
debug.warn("\"{}\":", entry.key);
|
|
||||||
entry.value.dump();
|
|
||||||
}
|
|
||||||
debug.warn("}}");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dumpIndent(self: Value, indent: usize) void {
|
pub fn dumpIndent(self: Value, comptime indent: usize) void {
|
||||||
if (indent == 0) {
|
if (indent == 0) {
|
||||||
self.dump();
|
self.dump();
|
||||||
} else {
|
} 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 {
|
pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void {
|
||||||
switch (self) {
|
var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
|
||||||
Value.Null => {
|
w.newline = "";
|
||||||
debug.warn("null");
|
w.one_indent = "";
|
||||||
},
|
w.space = "";
|
||||||
Value.Bool => |inner| {
|
try w.emitJson(self);
|
||||||
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("}}");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn padSpace(indent: usize) void {
|
pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void {
|
||||||
var i: usize = 0;
|
var one_indent = " " ** indent;
|
||||||
while (i < indent) : (i += 1) {
|
|
||||||
debug.warn(" ");
|
var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream);
|
||||||
}
|
w.one_indent = one_indent;
|
||||||
|
try w.emitJson(self);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,9 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
|||||||
/// The string used as a newline character.
|
/// The string used as a newline character.
|
||||||
newline: []const u8 = "\n",
|
newline: []const u8 = "\n",
|
||||||
|
|
||||||
|
/// The string used as spacing.
|
||||||
|
space: []const u8 = " ",
|
||||||
|
|
||||||
stream: *OutStream,
|
stream: *OutStream,
|
||||||
state_index: usize,
|
state_index: usize,
|
||||||
state: [max_depth]State,
|
state: [max_depth]State,
|
||||||
@ -87,7 +90,8 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
|||||||
self.pushState(.Value);
|
self.pushState(.Value);
|
||||||
try self.indent();
|
try self.indent();
|
||||||
try self.writeEscapedString(name);
|
try self.writeEscapedString(name);
|
||||||
try self.stream.write(": ");
|
try self.stream.write(":");
|
||||||
|
try self.stream.write(self.space);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user