mirror of
https://github.com/ziglang/zig.git
synced 2026-01-21 06:45:24 +00:00
std: use json.StringifyOptions.Whitespace from json.WriteStream
This commit is contained in:
parent
a32d88f12c
commit
42cabe4366
@ -21,14 +21,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
|
||||
pub const Stream = OutStream;
|
||||
|
||||
/// The string used for indenting.
|
||||
one_indent: []const u8 = " ",
|
||||
|
||||
/// The string used as a newline character.
|
||||
newline: []const u8 = "\n",
|
||||
|
||||
/// The string used as spacing.
|
||||
space: []const u8 = " ",
|
||||
whitespace: std.json.StringifyOptions.Whitespace = std.json.StringifyOptions.Whitespace{
|
||||
.indent_level = 0,
|
||||
.indent = .{ .Space = 1 },
|
||||
},
|
||||
|
||||
stream: OutStream,
|
||||
state_index: usize,
|
||||
@ -49,12 +45,14 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField
|
||||
try self.stream.writeByte('[');
|
||||
self.state[self.state_index] = State.ArrayStart;
|
||||
self.whitespace.indent_level += 1;
|
||||
}
|
||||
|
||||
pub fn beginObject(self: *Self) !void {
|
||||
assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField
|
||||
try self.stream.writeByte('{');
|
||||
self.state[self.state_index] = State.ObjectStart;
|
||||
self.whitespace.indent_level += 1;
|
||||
}
|
||||
|
||||
pub fn arrayElem(self: *Self) !void {
|
||||
@ -90,8 +88,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
self.pushState(.Value);
|
||||
try self.indent();
|
||||
try self.writeEscapedString(name);
|
||||
try self.stream.writeAll(":");
|
||||
try self.stream.writeAll(self.space);
|
||||
try self.stream.writeByte(':');
|
||||
if (self.whitespace.separator) {
|
||||
try self.stream.writeByte(' ');
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -103,10 +103,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
.ObjectStart => unreachable,
|
||||
.Object => unreachable,
|
||||
.ArrayStart => {
|
||||
self.whitespace.indent_level -= 1;
|
||||
try self.stream.writeByte(']');
|
||||
self.popState();
|
||||
},
|
||||
.Array => {
|
||||
self.whitespace.indent_level -= 1;
|
||||
try self.indent();
|
||||
self.popState();
|
||||
try self.stream.writeByte(']');
|
||||
@ -121,10 +123,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
.ArrayStart => unreachable,
|
||||
.Array => unreachable,
|
||||
.ObjectStart => {
|
||||
self.whitespace.indent_level -= 1;
|
||||
try self.stream.writeByte('}');
|
||||
self.popState();
|
||||
},
|
||||
.Object => {
|
||||
self.whitespace.indent_level -= 1;
|
||||
try self.indent();
|
||||
self.popState();
|
||||
try self.stream.writeByte('}');
|
||||
@ -187,39 +191,15 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
|
||||
|
||||
/// Writes the complete json into the output stream
|
||||
pub fn emitJson(self: *Self, json: std.json.Value) Stream.Error!void {
|
||||
switch (json) {
|
||||
.Null => try self.emitNull(),
|
||||
.Bool => |inner| try self.emitBool(inner),
|
||||
.Integer => |inner| try self.emitNumber(inner),
|
||||
.Float => |inner| try self.emitNumber(inner),
|
||||
.String => |inner| try self.emitString(inner),
|
||||
.Array => |inner| {
|
||||
try self.beginArray();
|
||||
for (inner.span()) |elem| {
|
||||
try self.arrayElem();
|
||||
try self.emitJson(elem);
|
||||
}
|
||||
try self.endArray();
|
||||
},
|
||||
.Object => |inner| {
|
||||
try self.beginObject();
|
||||
var it = inner.iterator();
|
||||
while (it.next()) |entry| {
|
||||
try self.objectField(entry.key);
|
||||
try self.emitJson(entry.value);
|
||||
}
|
||||
try self.endObject();
|
||||
},
|
||||
}
|
||||
try json.jsonStringify(std.json.StringifyOptions{
|
||||
.whitespace = self.whitespace,
|
||||
}, self.stream);
|
||||
}
|
||||
|
||||
fn indent(self: *Self) !void {
|
||||
assert(self.state_index >= 1);
|
||||
try self.stream.writeAll(self.newline);
|
||||
var i: usize = 0;
|
||||
while (i < self.state_index - 1) : (i += 1) {
|
||||
try self.stream.writeAll(self.one_indent);
|
||||
}
|
||||
try self.stream.writeByte('\n');
|
||||
try self.whitespace.outputIndent(self.stream);
|
||||
}
|
||||
|
||||
fn pushState(self: *Self, state: State) void {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user