authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-02-25 02:03:23+11:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-04-01 00:12:59+11:00
log42cabe436675dd20d67de533e534df4f5cf46cd2
tree64731455fa4cafda295f0560f5fb7138abf71fb7
parenta32d88f12c65b48c8861748f0879bcb1b5be61d0
signaturelock-open Commit is signed but in an unrecognized format.

std: use json.StringifyOptions.Whitespace from json.WriteStream


1 files changed, 19 insertions(+), 39 deletions(-)

lib/std/json/write_stream.zig+19-39
......@@ -21,14 +21,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
2121
2222 pub const Stream = OutStream;
2323
24 /// The string used for indenting.
25 one_indent: []const u8 = " ",
26
27 /// The string used as a newline character.
28 newline: []const u8 = "\n",
29
30 /// The string used as spacing.
31 space: []const u8 = " ",
24 whitespace: std.json.StringifyOptions.Whitespace = std.json.StringifyOptions.Whitespace{
25 .indent_level = 0,
26 .indent = .{ .Space = 1 },
27 },
3228
3329 stream: OutStream,
3430 state_index: usize,
......@@ -49,12 +45,14 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
4945 assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField
5046 try self.stream.writeByte('[');
5147 self.state[self.state_index] = State.ArrayStart;
48 self.whitespace.indent_level += 1;
5249 }
5350
5451 pub fn beginObject(self: *Self) !void {
5552 assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField
5653 try self.stream.writeByte('{');
5754 self.state[self.state_index] = State.ObjectStart;
55 self.whitespace.indent_level += 1;
5856 }
5957
6058 pub fn arrayElem(self: *Self) !void {
......@@ -90,8 +88,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
9088 self.pushState(.Value);
9189 try self.indent();
9290 try self.writeEscapedString(name);
93 try self.stream.writeAll(":");
94 try self.stream.writeAll(self.space);
91 try self.stream.writeByte(':');
92 if (self.whitespace.separator) {
93 try self.stream.writeByte(' ');
94 }
9595 },
9696 }
9797 }
......@@ -103,10 +103,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
103103 .ObjectStart => unreachable,
104104 .Object => unreachable,
105105 .ArrayStart => {
106 self.whitespace.indent_level -= 1;
106107 try self.stream.writeByte(']');
107108 self.popState();
108109 },
109110 .Array => {
111 self.whitespace.indent_level -= 1;
110112 try self.indent();
111113 self.popState();
112114 try self.stream.writeByte(']');
......@@ -121,10 +123,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
121123 .ArrayStart => unreachable,
122124 .Array => unreachable,
123125 .ObjectStart => {
126 self.whitespace.indent_level -= 1;
124127 try self.stream.writeByte('}');
125128 self.popState();
126129 },
127130 .Object => {
131 self.whitespace.indent_level -= 1;
128132 try self.indent();
129133 self.popState();
130134 try self.stream.writeByte('}');
......@@ -187,39 +191,15 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type {
187191
188192 /// Writes the complete json into the output stream
189193 pub fn emitJson(self: *Self, json: std.json.Value) Stream.Error!void {
190 switch (json) {
191 .Null => try self.emitNull(),
192 .Bool => |inner| try self.emitBool(inner),
193 .Integer => |inner| try self.emitNumber(inner),
194 .Float => |inner| try self.emitNumber(inner),
195 .String => |inner| try self.emitString(inner),
196 .Array => |inner| {
197 try self.beginArray();
198 for (inner.span()) |elem| {
199 try self.arrayElem();
200 try self.emitJson(elem);
201 }
202 try self.endArray();
203 },
204 .Object => |inner| {
205 try self.beginObject();
206 var it = inner.iterator();
207 while (it.next()) |entry| {
208 try self.objectField(entry.key);
209 try self.emitJson(entry.value);
210 }
211 try self.endObject();
212 },
213 }
194 try json.jsonStringify(std.json.StringifyOptions{
195 .whitespace = self.whitespace,
196 }, self.stream);
214197 }
215198
216199 fn indent(self: *Self) !void {
217200 assert(self.state_index >= 1);
218 try self.stream.writeAll(self.newline);
219 var i: usize = 0;
220 while (i < self.state_index - 1) : (i += 1) {
221 try self.stream.writeAll(self.one_indent);
222 }
201 try self.stream.writeByte('\n');
202 try self.whitespace.outputIndent(self.stream);
223203 }
224204
225205 fn pushState(self: *Self, state: State) void {