authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-03-10 23:36:27+11:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-26 12:00:33-04:00
log292d515e9119e2d02afa2197a255e1ec865d034e
tree5c817f82372619fc868d13f17ad0e1d4726cd8ca
parentd10e407977f1ba165ca3d0a04d7b270096185559

std: allow specifiying enums to be formatted as numbers


1 files changed, 21 insertions(+), 1 deletions(-)

lib/std/fmt.zig+21-1
...@@ -359,11 +359,28 @@ pub fn formatType(...@@ -359,11 +359,28 @@ pub fn formatType(
359 },359 },
360 .Enum => |enumInfo| {360 .Enum => |enumInfo| {
361 try out_stream.writeAll(@typeName(T));361 try out_stream.writeAll(@typeName(T));
362
363 var has_name: bool = undefined;
362 if (enumInfo.is_exhaustive) {364 if (enumInfo.is_exhaustive) {
365 has_name = true;
366 } else {
367 // TODO: when @tagName works on exhaustive enums print known enum strings
368 has_name = false;
369 }
370
371 var use_name = has_name;
372 if (comptime std.mem.eql(u8, fmt, "x") or
373 comptime std.mem.eql(u8, fmt, "X") or
374 comptime std.mem.eql(u8, fmt, "d") or
375 comptime std.mem.eql(u8, fmt, "b"))
376 {
377 use_name = false;
378 }
379
380 if (use_name) {
363 try out_stream.writeAll(".");381 try out_stream.writeAll(".");
364 try out_stream.writeAll(@tagName(value));382 try out_stream.writeAll(@tagName(value));
365 } else {383 } else {
366 // TODO: when @tagName works on exhaustive enums print known enum strings
367 try out_stream.writeAll("(");384 try out_stream.writeAll("(");
368 try formatType(@enumToInt(value), fmt, options, out_stream, max_depth);385 try formatType(@enumToInt(value), fmt, options, out_stream, max_depth);
369 try out_stream.writeAll(")");386 try out_stream.writeAll(")");
...@@ -1308,6 +1325,8 @@ test "enum" {...@@ -1308,6 +1325,8 @@ test "enum" {
1308 const value = Enum.Two;1325 const value = Enum.Two;
1309 try testFmt("enum: Enum.Two\n", "enum: {}\n", .{value});1326 try testFmt("enum: Enum.Two\n", "enum: {}\n", .{value});
1310 try testFmt("enum: Enum.Two\n", "enum: {}\n", .{&value});1327 try testFmt("enum: Enum.Two\n", "enum: {}\n", .{&value});
1328 try testFmt("enum: Enum(0)\n", "enum: {x}\n", .{Enum.One});
1329 try testFmt("enum: Enum(1)\n", "enum: {X}\n", .{Enum.Two});
1311}1330}
13121331
1313test "non-exhaustive enum" {1332test "non-exhaustive enum" {
...@@ -1321,6 +1340,7 @@ test "non-exhaustive enum" {...@@ -1321,6 +1340,7 @@ test "non-exhaustive enum" {
1321 try testFmt("enum: Enum(4660)\n", "enum: {}\n", .{@intToEnum(Enum, 0x1234)});1340 try testFmt("enum: Enum(4660)\n", "enum: {}\n", .{@intToEnum(Enum, 0x1234)});
1322 try testFmt("enum: Enum(f)\n", "enum: {x}\n", .{Enum.One});1341 try testFmt("enum: Enum(f)\n", "enum: {x}\n", .{Enum.One});
1323 try testFmt("enum: Enum(beef)\n", "enum: {x}\n", .{Enum.Two});1342 try testFmt("enum: Enum(beef)\n", "enum: {x}\n", .{Enum.Two});
1343 try testFmt("enum: Enum(BEEF)\n", "enum: {X}\n", .{Enum.Two});
1324 try testFmt("enum: Enum(1234)\n", "enum: {x}\n", .{@intToEnum(Enum, 0x1234)});1344 try testFmt("enum: Enum(1234)\n", "enum: {x}\n", .{@intToEnum(Enum, 0x1234)});
1325}1345}
13261346