A SpaceTraders Agent

create function to combine multiple enums into one

altagos.dev e313b3f7 0a2b039f

verified
+34
+34
src/meta/root.zig
··· 1 1 pub const fmt = @import("fmt.zig"); 2 2 3 3 pub const pretty = fmt.pretty; 4 + 5 + pub fn CombinedEnum(comptime parent: type) type { 6 + const std = @import("std"); 7 + const parent_info = @typeInfo(parent).@"struct"; 8 + 9 + var num_fields = 0; 10 + 11 + for (parent_info.decls) |partial| { 12 + switch (@typeInfo(@FieldType(parent, partial.name))) { 13 + .@"enum" => |_| num_fields += 1, 14 + else => {}, 15 + } 16 + } 17 + 18 + var combined: [num_fields]std.builtin.Type.EnumField = undefined; 19 + 20 + var i = 0; 21 + for (parent_info.decls) |partial| { 22 + switch (@typeInfo(@FieldType(parent, partial.name))) { 23 + .@"enum" => |e| { 24 + for (e.fields) |field| { 25 + combined[i] = field; 26 + i += 1; 27 + } 28 + }, 29 + else => {}, 30 + } 31 + } 32 + 33 + return @Type(.{ .@"enum" = .{ 34 + .decls = &.{}, 35 + .fields = &combined, 36 + } }); 37 + }