Commit 42cabe4366
Changed files (1)
lib
std
json
lib/std/json/write_stream.zig
@@ -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 {