Browse Source

Merge pull request #634 from Tetralux/enum_from_name

Add reflect.enum_from_name
gingerBill 5 years ago
parent
commit
e3f3e715e2
1 changed files with 28 additions and 0 deletions
  1. 28 0
      core/reflect/reflect.odin

+ 28 - 0
core/reflect/reflect.odin

@@ -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);