Skip to content

Commit

Permalink
zon.stringify: Correctly serialize unions with void fields
Browse files Browse the repository at this point in the history
Closes #22933
  • Loading branch information
NicoElbers authored and alexrp committed Feb 19, 2025
1 parent 59dc15f commit 0cf6ae2
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions lib/std/zon/stringify.zig
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,6 @@ pub fn Serializer(Writer: type) type {
.bool, .null => try std.fmt.format(self.writer, "{}", .{val}),
.enum_literal => try self.ident(@tagName(val)),
.@"enum" => try self.ident(@tagName(val)),
.void => try self.writer.writeAll("{}"),
.pointer => |pointer| {
// Try to serialize as a string
const item: ?type = switch (@typeInfo(pointer.child)) {
Expand Down Expand Up @@ -579,15 +578,21 @@ pub fn Serializer(Writer: type) type {
},
.@"union" => |@"union"| {
comptime assert(@"union".tag_type != null);
var container = try self.startStruct(.{ .whitespace_style = .{ .fields = 1 } });
switch (val) {
inline else => |pl, tag| try container.fieldArbitraryDepth(
@tagName(tag),
pl,
options,
),
inline else => |pl, tag| if (@TypeOf(pl) == void)
try self.writer.print(".{s}", .{@tagName(tag)})
else {
var container = try self.startStruct(.{ .whitespace_style = .{ .fields = 1 } });

try container.fieldArbitraryDepth(
@tagName(tag),
pl,
options,
);

try container.finish();
},
}
try container.finish();
},
.optional => if (val) |inner| {
try self.valueArbitraryDepth(inner, options);
Expand Down Expand Up @@ -1116,6 +1121,12 @@ test "std.zon stringify whitespace, high level API" {
\\ 3,
\\} }
, .{ .inner = .{ 1, 2, 3 } }, .{});

const UnionWithVoid = union(enum) { a, b: void, c: u8 };

try expectSerializeEqual(
\\.a
, UnionWithVoid.a, .{});
}

test "std.zon stringify whitespace, low level API" {
Expand Down

0 comments on commit 0cf6ae2

Please sign in to comment.