zig-webgpu-gen

git clone git://git.electrosoup.com/zig-webgpu-gen
Log | Files | Refs

commit 3ef25b96045f81e8bd7f82ef238cde76dfc333c2
parent c78365ba35656a6efb422077bed76f9c8c7059fa
Author: Christian Ermann <christianermann@gmail.com>
Date:   Sun,  1 Mar 2026 13:52:06 -0800

Improve enum rendering

Diffstat:
Msrc/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();