Commit 42cabe4366

daurnimator <quae@daurnimator.com>
2020-02-24 16:03:23
std: use json.StringifyOptions.Whitespace from json.WriteStream
1 parent a32d88f
Changed files (1)
lib
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 {