diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index a0d6d66d1..1cbe45925 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1408,34 +1408,9 @@ fmt_soa_pointer :: proc(fi: ^Info, p: runtime.Raw_Soa_Pointer, verb: rune) { // // Returns: The string representation of the enum value and a boolean indicating success. // +@(require_results) enum_value_to_string :: proc(val: any) -> (string, bool) { - v := val - v.id = runtime.typeid_base(v.id) - type_info := type_info_of(v.id) - - #partial switch e in type_info.variant { - case: return "", false - case runtime.Type_Info_Enum: - Enum_Value :: runtime.Type_Info_Enum_Value - - ev_, ok := reflect.as_i64(val) - ev := Enum_Value(ev_) - - if ok { - if len(e.values) == 0 { - return "", true - } else { - for val, idx in e.values { - if val == ev { - return e.names[idx], true - } - } - } - return "", false - } - } - - return "", false + return reflect.enum_name_from_value_any(val) } // Returns the enum value of a string representation. // diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 1ff7df229..0af23b18e 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -627,6 +627,43 @@ enum_from_name_any :: proc(Enum_Type: typeid, name: string) -> (value: Type_Info return } +@(require_results) +enum_name_from_value :: proc(value: $Enum_Type) -> (name: string, ok: bool) where intrinsics.type_is_enum(Enum_Type) { + ti := type_info_base(type_info_of(Enum_Type)) + e := ti.variant.(runtime.Type_Info_Enum) or_return + if len(e.values) == 0 { + return + } + ev := Type_Info_Enum_Value(value) + for val, idx in e.values { + if val == ev { + return e.names[idx], true + } + } + return +} + +@(require_results) +enum_name_from_value_any :: proc(value: any) -> (name: string, ok: bool) { + if value.id == nil { + return + } + ti := type_info_base(type_info_of(value.id)) + e := ti.variant.(runtime.Type_Info_Enum) or_return + if len(e.values) == 0 { + return + } + ev := Type_Info_Enum_Value(as_i64(value) or_return) + for val, idx in e.values { + if val == ev { + return e.names[idx], true + } + } + return +} + + + @(require_results) enum_field_names :: proc(Enum_Type: typeid) -> []string {