59 lines
1008 B
Plaintext
59 lines
1008 B
Plaintext
Layout :: enum {
|
|
auto
|
|
c
|
|
}
|
|
|
|
FieldInfo :: struct {
|
|
name []u8
|
|
type type
|
|
index usize
|
|
}
|
|
|
|
RecordInfo :: struct {
|
|
name ?[]u8
|
|
fields []FieldInfo
|
|
is_tuple bool
|
|
layout Layout
|
|
}
|
|
|
|
EnumInfo :: struct {
|
|
fields []FieldInfo
|
|
}
|
|
|
|
TypeInfo :: union(enum) {
|
|
invalid void
|
|
void void
|
|
anyopaque void
|
|
bool void
|
|
integer void
|
|
float void
|
|
array void
|
|
pointer void
|
|
slice void
|
|
range void
|
|
optional void
|
|
function void
|
|
enum EnumInfo
|
|
record RecordInfo
|
|
union void
|
|
fallible void
|
|
distinct void
|
|
}
|
|
|
|
EnumFieldStruct func($E, $Field type, $default ?Field) type {
|
|
match typeinfo!(E) {
|
|
.enum |info|: {
|
|
names [info.fields.len]mut []u8 = undefined
|
|
field_types [info.fields.len]mut type = undefined
|
|
defaults [info.fields.len]mut ?Field = undefined
|
|
expand for info.fields |field, index| {
|
|
names[index] = field.name
|
|
field_types[index] = Field
|
|
defaults[index] = default
|
|
}
|
|
return struct_type!(.auto, names, field_types, defaults)
|
|
}
|
|
else: compile_error!("EnumFieldStruct key must be an enum")
|
|
}
|
|
}
|