A SpaceTraders Agent

add funtion to get original type

altagos.dev 6ed55d6b 4396b5df

verified
+41 -5
+40 -4
src/meta/root.zig
··· 7 7 const parent_info = @typeInfo(parent).@"struct"; 8 8 9 9 var num_fields = 0; 10 + var num_enums = 0; 10 11 11 12 for (parent_info.decls) |partial| { 12 13 switch (@typeInfo(@field(parent, partial.name))) { 13 14 .@"enum" => |e| { 14 15 num_fields += e.fields.len; 16 + num_enums += 1; 15 17 }, 16 18 else => {}, 17 19 } 18 20 } 19 21 22 + const ConversionMap = struct { 23 + start: comptime_int = 0, 24 + end: comptime_int = 0, 25 + T: type, 26 + }; 27 + 20 28 var combined: [num_fields]std.builtin.Type.EnumField = undefined; 29 + var conv_map: [num_enums]ConversionMap = undefined; 21 30 31 + var idx = 0; 22 32 var i = 0; 33 + 23 34 for (parent_info.decls) |partial| { 24 35 switch (@typeInfo(@field(parent, partial.name))) { 25 36 .@"enum" => |e| { 37 + conv_map[idx] = .{ 38 + .start = i, 39 + .end = i + e.fields.len - 1, 40 + .T = @field(parent, partial.name), 41 + }; 42 + 26 43 for (e.fields) |field| { 27 - combined[i] = field; 44 + combined[i] = .{ .name = field.name, .value = field.value }; 28 45 i += 1; 29 46 } 47 + 48 + idx += 1; 30 49 }, 31 50 else => {}, 32 51 } 33 52 } 34 53 35 - return @Type(std.builtin.Type{ .@"enum" = .{ 54 + const combined_enum = @Type(std.builtin.Type{ .@"enum" = .{ 36 55 .decls = &.{}, 37 - .fields = combined[0..i], 56 + .fields = &combined, 38 57 .tag_type = u8, 39 - .is_exhaustive = false, 58 + .is_exhaustive = true, 40 59 } }); 60 + 61 + const combined_enums = num_enums; 62 + const conv_map_const = conv_map; 63 + 64 + return struct { 65 + pub const Combined = combined_enum; 66 + 67 + const conversion_map: [combined_enums]ConversionMap = conv_map_const; 68 + 69 + pub fn originalType(value: @TypeOf(Combined)) type { 70 + const int_rep: u8 = @intFromEnum(value); 71 + 72 + for (conversion_map) |map| { 73 + if (map.start <= int_rep and int_rep <= map.end) return map.T; 74 + } 75 + } 76 + }; 41 77 } 42 78 43 79 test {
+1 -1
src/st/models/inventory.zig
··· 7 7 }; 8 8 9 9 pub const Item = struct { 10 - symbol: AllItems, 10 + symbol: AllItems.Combined, 11 11 name: []const u8, 12 12 description: []const u8, 13 13 units: u64,