commit 81ee36dcbae6104b42a145c499c8ec60f1555d8b
parent 3ef25b96045f81e8bd7f82ef238cde76dfc333c2
Author: Christian Ermann <christianermann@gmail.com>
Date: Sun, 1 Mar 2026 14:42:51 -0800
Improve bitflag rendering
Diffstat:
| M | src/main.zig | | | 55 | ++++++++++++++++++++++++++++++++++++++++++++++++------- |
1 file changed, 48 insertions(+), 7 deletions(-)
diff --git a/src/main.zig b/src/main.zig
@@ -407,15 +407,52 @@ const BitFlag = struct {
extended: ?bool = null,
entries: []const ?BitFlagEntry,
- pub fn render(self: BitFlag, writer: anytype) !void {
+ pub fn render(self: BitFlag, writer: anytype, indent: u32) !void {
+ try renderDoc(self, writer, indent);
+ try renderIndent(indent, writer);
try writer.writeAll("pub const ");
try snakeToPascal(self.name, writer);
try writer.writeAll(" = packed struct(u64) {\n");
for (self.entries) |maybe_entry| {
if (maybe_entry) |entry| {
- try writer.print(" {s}: bool = false\n", .{ entry.name });
+ if (entry.value) |value| {
+ _ = value;
+ return error.Unimplemented;
+ }
+ if (entry.value_combination) |value| {
+ _ = value;
+ continue;
+ }
+ try renderDoc(entry, writer, indent + 1);
+ try renderIndent(indent + 1, writer);
+ try writer.print("{s}: bool = false,\n", .{ entry.name });
}
}
+ for (self.entries) |maybe_entry| {
+ if (maybe_entry) |entry| {
+ if (entry.value_combination) |values| {
+ try writer.writeAll("\n");
+ try renderDoc(entry, writer, indent + 1);
+ try renderIndent(indent + 1, writer);
+ try writer.writeAll("pub fn ");
+ try snakeToCamel(entry.name, writer);
+ try writer.writeAll("() ");
+ try snakeToPascal(self.name, writer);
+ try writer.writeAll(" {\n");
+ try renderIndent(indent + 2, writer);
+ try writer.writeAll("return .{\n");
+ for (values) |value| {
+ try renderIndent(indent + 3, writer);
+ try writer.print(".{s} = true,\n", .{ value });
+ }
+ try renderIndent(indent + 2, writer);
+ try writer.writeAll("}\n");
+ try renderIndent(indent + 1, writer);
+ try writer.writeAll("}\n");
+ }
+ }
+ }
+ try renderIndent(indent, writer);
try writer.writeAll("};\n");
}
};
@@ -425,7 +462,7 @@ const BitFlagEntry = struct {
namespace: ?[]const u8 = null,
doc: []const u8,
value: ?Value64 = null,
- value_combination: ?[][]const u8 = null
+ value_combination: ?[][]const u8 = null,
};
const Struct = struct {
@@ -570,9 +607,7 @@ fn renderDoc(
if (token.len <= 0) {
continue;
}
- for (0..indent) |_| {
- try writer.writeAll(" ");
- }
+ try renderIndent(indent, writer);
try writer.print("/// {s}", .{ token });
if (!std.mem.endsWith(u8, token, "\n")) {
try writer.writeAll("\n");
@@ -580,6 +615,12 @@ fn renderDoc(
}
}
+fn renderIndent(indent: u32, writer: anytype) !void {
+ for (0..indent) |_| {
+ try writer.writeAll(" ");
+ }
+}
+
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
@@ -613,7 +654,7 @@ pub fn main() !void {
}
try stdout.writeAll("// bitflags\n");
for (parsed.value.bitflags) |bitflag| {
- try bitflag.render(stdout);
+ try bitflag.render(stdout, 0);
try stdout.writeAll("\n");
}
try stdout.writeAll("// structs\n");