aboutsummaryrefslogtreecommitdiff
path: root/lib/std/json.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-03-18 20:35:19 -0400
committerAndrew Kelley <andrew@ziglang.org>2020-03-19 09:53:55 -0400
commit7fa88cc0a678a3690b61054030f5597b623964a4 (patch)
treea1cdaabfbbe0fe8b240691a9b1921245973f5107 /lib/std/json.zig
parentb5dba702fff35c2d9aa86c9d5dd93a4a38d3b75b (diff)
downloadzig-7fa88cc0a678a3690b61054030f5597b623964a4.tar.gz
zig-7fa88cc0a678a3690b61054030f5597b623964a4.zip
std lib fixups for new semantics
std lib tests are passing now
Diffstat (limited to 'lib/std/json.zig')
-rw-r--r--lib/std/json.zig23
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig
index f5a72d86da..3dd8088785 100644
--- a/lib/std/json.zig
+++ b/lib/std/json.zig
@@ -2249,11 +2249,16 @@ pub const StringifyOptions = struct {
// TODO: allow picking if []u8 is string or array?
};
+pub const StringifyError = error{
+ TooMuchData,
+ DifferentData,
+};
+
pub fn stringify(
value: var,
options: StringifyOptions,
out_stream: var,
-) !void {
+) StringifyError!void {
const T = @TypeOf(value);
switch (@typeInfo(T)) {
.Float, .ComptimeFloat => {
@@ -2320,9 +2325,15 @@ pub fn stringify(
return;
},
.Pointer => |ptr_info| switch (ptr_info.size) {
- .One => {
- // TODO: avoid loops?
- return try stringify(value.*, options, out_stream);
+ .One => switch (@typeInfo(ptr_info.child)) {
+ .Array => {
+ const Slice = []const std.meta.Elem(ptr_info.child);
+ return stringify(@as(Slice, value), options, out_stream);
+ },
+ else => {
+ // TODO: avoid loops?
+ return stringify(value.*, options, out_stream);
+ },
},
// TODO: .Many when there is a sentinel (waiting for https://github.com/ziglang/zig/pull/3972)
.Slice => {
@@ -2381,9 +2392,7 @@ pub fn stringify(
},
else => @compileError("Unable to stringify type '" ++ @typeName(T) ++ "'"),
},
- .Array => |info| {
- return try stringify(value[0..], options, out_stream);
- },
+ .Array => return stringify(&value, options, out_stream),
else => @compileError("Unable to stringify type '" ++ @typeName(T) ++ "'"),
}
unreachable;