mirror of
https://github.com/odin-lang/Odin.git
synced 2026-02-13 14:53:34 +00:00
Merge pull request #634 from Tetralux/enum_from_name
Add reflect.enum_from_name
This commit is contained in:
@@ -510,6 +510,34 @@ enum_string :: proc(a: any) -> string {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Given a enum type and a value name, get the enum value.
|
||||
enum_from_name :: proc($EnumType: typeid, name: string) -> (value: EnumType, ok: bool) {
|
||||
ti := type_info_base(type_info_of(EnumType));
|
||||
if eti, eti_ok := ti.variant.(runtime.Type_Info_Enum); eti_ok {
|
||||
for value_name, i in eti.names {
|
||||
if value_name != name do continue;
|
||||
value_union := eti.values[i];
|
||||
switch v in value_union {
|
||||
case rune: value = EnumType(v); ok = true;
|
||||
case u8: value = EnumType(v); ok = true;
|
||||
case u16: value = EnumType(v); ok = true;
|
||||
case u32: value = EnumType(v); ok = true;
|
||||
case u64: value = EnumType(v); ok = true;
|
||||
case uint: value = EnumType(v); ok = true;
|
||||
case uintptr: value = EnumType(v); ok = true;
|
||||
case i8: value = EnumType(v); ok = true;
|
||||
case i16: value = EnumType(v); ok = true;
|
||||
case i32: value = EnumType(v); ok = true;
|
||||
case i64: value = EnumType(v); ok = true;
|
||||
case int: value = EnumType(v); ok = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
panic("expected enum type to reflect.enum_from_name");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
union_variant_type_info :: proc(a: any) -> ^runtime.Type_Info {
|
||||
id := union_variant_typeid(a);
|
||||
return type_info_of(id);
|
||||
|
||||
Reference in New Issue
Block a user