commit 3ef25b96045f81e8bd7f82ef238cde76dfc333c2
parent c78365ba35656a6efb422077bed76f9c8c7059fa
Author: Christian Ermann <christianermann@gmail.com>
Date: Sun, 1 Mar 2026 13:52:06 -0800
Improve enum rendering
Diffstat:
| M | src/main.zig | | | 53 | +++++++++++++++++++++++++++++++++++++++++++---------- |
1 file changed, 43 insertions(+), 10 deletions(-)
diff --git a/src/main.zig b/src/main.zig
@@ -364,14 +364,20 @@ const Enum = struct {
extended: ?bool = null,
entries: []const ?EnumEntry,
- fn render(self: Enum, writer: anytype) !void {
+ pub fn render(self: Enum, writer: anytype) !void {
+ if (self.extended) |extended| {
+ _ = extended;
+ return error.Unimplemented;
+ }
+ try renderDoc(self, writer, 0);
try writer.writeAll("pub const ");
- try formatEnumName(self.name, writer);
+ try snakeToPascal(self.name, writer);
try writer.writeAll(" = enum(u32) {\n");
for (self.entries, 0..) |maybe_entry, i| {
if (maybe_entry) |entry| {
+ try renderDoc(entry, writer, 1);
try writer.writeAll(" ");
- try formatEnumField(entry.name, writer);
+ try entry.render(writer);
try writer.print(" = {d},\n", .{ i });
}
}
@@ -384,6 +390,14 @@ const EnumEntry = struct {
namespace: ?[] const u8 = null,
doc: []const u8,
value: ?u16 = null,
+
+ pub fn render(self: EnumEntry, writer: anytype) !void {
+ if (self.value) |value| {
+ _ = value;
+ return error.Unimplemented;
+ }
+ try toLowercase(self.name, writer);
+ }
};
const BitFlag = struct {
@@ -395,7 +409,7 @@ const BitFlag = struct {
pub fn render(self: BitFlag, writer: anytype) !void {
try writer.writeAll("pub const ");
- try formatEnumName(self.name, writer);
+ try snakeToPascal(self.name, writer);
try writer.writeAll(" = packed struct(u64) {\n");
for (self.entries) |maybe_entry| {
if (maybe_entry) |entry| {
@@ -425,7 +439,7 @@ const Struct = struct {
fn render(self: Struct, writer: anytype) !void {
try writer.writeAll("pub const ");
- try formatEnumName(self.name, writer);
+ try snakeToPascal(self.name, writer);
try writer.writeAll(" = extern struct {\n");
if (self.members) |members| {
for (members) |member| {
@@ -536,17 +550,36 @@ fn snakeToCamel(str: []const u8, writer: anytype) !void {
}
}
-fn formatEnumName(str: []const u8, writer: anytype) !void {
- return snakeToPascal(str, writer);
-}
-
-fn formatEnumField(str: []const u8, writer: anytype) !void {
+fn toLowercase(str: []const u8, writer: anytype) !void {
for (str) |anycase| {
const lowercase = std.ascii.toLower(anycase);
try writer.writeByte(lowercase);
}
}
+fn renderDoc(
+ self: anytype,
+ writer: anytype,
+ indent: u32,
+) !void {
+ if (std.mem.startsWith(u8, self.doc, "TODO")) {
+ return;
+ }
+ var it = std.mem.splitScalar(u8, self.doc, '\n');
+ while (it.next()) |token| {
+ if (token.len <= 0) {
+ continue;
+ }
+ for (0..indent) |_| {
+ try writer.writeAll(" ");
+ }
+ try writer.print("/// {s}", .{ token });
+ if (!std.mem.endsWith(u8, token, "\n")) {
+ try writer.writeAll("\n");
+ }
+ }
+}
+
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();