mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
Merge 28b3042f9e into 9082b004b6
This commit is contained in:
commit
6a6b7f7caf
1 changed files with 51 additions and 0 deletions
|
|
@ -28,6 +28,8 @@ const valid_types = {};
|
|||
pub const Options = struct {
|
||||
/// If true, unknown fields do not error.
|
||||
ignore_unknown_fields: bool = false,
|
||||
/// Enables parsing enum literals as `[]const u8`.
|
||||
enum_literals_as_strings: bool = false,
|
||||
/// If true, the parser cleans up partially parsed values on error. This requires some extra
|
||||
/// bookkeeping, so you may want to turn it off if you don't need this feature (e.g. because
|
||||
/// you're using arena allocation.)
|
||||
|
|
@ -690,6 +692,23 @@ const Parser = struct {
|
|||
.string_literal => return self.parseString(T, node),
|
||||
.array_literal => |nodes| return self.parseSlice(T, nodes),
|
||||
.empty_literal => return self.parseSlice(T, .{ .start = node, .len = 0 }),
|
||||
.enum_literal => |field_name| {
|
||||
if (!self.options.enum_literals_as_strings) return error.WrongType;
|
||||
const pointer = @typeInfo(T).pointer;
|
||||
if (pointer.child != u8 or
|
||||
pointer.size != .slice or
|
||||
!pointer.is_const or
|
||||
(pointer.sentinel() != null and pointer.sentinel() != 0) or
|
||||
pointer.alignment != 1)
|
||||
{
|
||||
return error.WrongType;
|
||||
}
|
||||
if (pointer.sentinel()) |_| {
|
||||
return self.gpa.dupeZ(u8, field_name.get(self.zoir));
|
||||
} else {
|
||||
return self.gpa.dupe(u8, field_name.get(self.zoir));
|
||||
}
|
||||
},
|
||||
else => return error.WrongType,
|
||||
}
|
||||
}
|
||||
|
|
@ -2413,6 +2432,38 @@ test "std.zon enum literals" {
|
|||
}
|
||||
}
|
||||
|
||||
test "std.zon enums_as_strings" {
|
||||
const gpa = std.testing.allocator;
|
||||
// bare literal
|
||||
{
|
||||
const parsed = try fromSliceAlloc([:0]const u8, gpa, ".my_enum_literal", null, .{
|
||||
.enum_literals_as_strings = true,
|
||||
});
|
||||
defer free(gpa, parsed);
|
||||
try std.testing.expectEqualStrings(@as([:0]const u8, "my_enum_literal"), parsed);
|
||||
}
|
||||
// quoted enum literal with a " special character
|
||||
{
|
||||
const parsed = try fromSliceAlloc([]const u8, gpa, ".@\"test\\\"\"", null, .{
|
||||
.enum_literals_as_strings = true,
|
||||
});
|
||||
defer free(gpa, parsed);
|
||||
try std.testing.expectEqualStrings(@as([]const u8, "test\""), parsed);
|
||||
}
|
||||
// bare literal in struct
|
||||
{
|
||||
const parsed = try fromSliceAlloc(struct {
|
||||
name: []const u8,
|
||||
type: []const u8,
|
||||
}, gpa, ".{ .name = .literal_0, .type = .literal_1 }", null, .{
|
||||
.enum_literals_as_strings = true,
|
||||
});
|
||||
defer free(gpa, parsed);
|
||||
try std.testing.expectEqualStrings(@as([]const u8, "literal_0"), parsed.name);
|
||||
try std.testing.expectEqualStrings(@as([]const u8, "literal_1"), parsed.type);
|
||||
}
|
||||
}
|
||||
|
||||
test "std.zon parse bool" {
|
||||
const gpa = std.testing.allocator;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue