tangled
alpha
login
or
join now
altagos.dev
/
space
0
fork
atom
A SpaceTraders Agent
0
fork
atom
overview
issues
pulls
pipelines
add funtion to get original type
altagos.dev
4 months ago
6ed55d6b
4396b5df
verified
This commit was signed with the committer's
known signature
.
altagos.dev
SSH Key Fingerprint:
SHA256:UbTjEcCZlc6GzQWLCuDK3D//HESWD2xFPkzue9XMras=
1/1
build.yml
success
24s
+41
-5
2 changed files
expand all
collapse all
unified
split
src
meta
root.zig
st
models
inventory.zig
+40
-4
src/meta/root.zig
···
7
7
const parent_info = @typeInfo(parent).@"struct";
8
8
9
9
var num_fields = 0;
10
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
16
+
num_enums += 1;
15
17
},
16
18
else => {},
17
19
}
18
20
}
19
21
22
22
+
const ConversionMap = struct {
23
23
+
start: comptime_int = 0,
24
24
+
end: comptime_int = 0,
25
25
+
T: type,
26
26
+
};
27
27
+
20
28
var combined: [num_fields]std.builtin.Type.EnumField = undefined;
29
29
+
var conv_map: [num_enums]ConversionMap = undefined;
21
30
31
31
+
var idx = 0;
22
32
var i = 0;
33
33
+
23
34
for (parent_info.decls) |partial| {
24
35
switch (@typeInfo(@field(parent, partial.name))) {
25
36
.@"enum" => |e| {
37
37
+
conv_map[idx] = .{
38
38
+
.start = i,
39
39
+
.end = i + e.fields.len - 1,
40
40
+
.T = @field(parent, partial.name),
41
41
+
};
42
42
+
26
43
for (e.fields) |field| {
27
27
-
combined[i] = field;
44
44
+
combined[i] = .{ .name = field.name, .value = field.value };
28
45
i += 1;
29
46
}
47
47
+
48
48
+
idx += 1;
30
49
},
31
50
else => {},
32
51
}
33
52
}
34
53
35
35
-
return @Type(std.builtin.Type{ .@"enum" = .{
54
54
+
const combined_enum = @Type(std.builtin.Type{ .@"enum" = .{
36
55
.decls = &.{},
37
37
-
.fields = combined[0..i],
56
56
+
.fields = &combined,
38
57
.tag_type = u8,
39
39
-
.is_exhaustive = false,
58
58
+
.is_exhaustive = true,
40
59
} });
60
60
+
61
61
+
const combined_enums = num_enums;
62
62
+
const conv_map_const = conv_map;
63
63
+
64
64
+
return struct {
65
65
+
pub const Combined = combined_enum;
66
66
+
67
67
+
const conversion_map: [combined_enums]ConversionMap = conv_map_const;
68
68
+
69
69
+
pub fn originalType(value: @TypeOf(Combined)) type {
70
70
+
const int_rep: u8 = @intFromEnum(value);
71
71
+
72
72
+
for (conversion_map) |map| {
73
73
+
if (map.start <= int_rep and int_rep <= map.end) return map.T;
74
74
+
}
75
75
+
}
76
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
10
-
symbol: AllItems,
10
10
+
symbol: AllItems.Combined,
11
11
name: []const u8,
12
12
description: []const u8,
13
13
units: u64,