From d20d957881c22928861be89070c094c8e8cb7ada Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Fri, 27 Dec 2024 23:21:36 +0100 Subject: [PATCH] Add `@enum_from_value` --- lib/std/core/builtin.c3 | 18 ++++++++++++++++++ releasenotes.md | 1 + 2 files changed, 19 insertions(+) diff --git a/lib/std/core/builtin.c3 b/lib/std/core/builtin.c3 index 28afdc2d5..6f996846e 100644 --- a/lib/std/core/builtin.c3 +++ b/lib/std/core/builtin.c3 @@ -235,6 +235,24 @@ macro enum_by_name($Type, String enum_name) @builtin return SearchResult.MISSING?; } +<* + @param $Type `The type of the enum` + @require $Type.kindof == ENUM `Only enums may be used` + @require $defined($Type.#value1) `Expected '#value' to match an enum associated value` + @require $assignable(value, $typeof($Type{}.#value)) `Expected the value to match the type of the associated value` + @ensure @typeis(return, $Type) + @return! SearchResult.MISSING +*> +macro @enum_from_value($Type, #value, value) @builtin +{ + usz elements = $Type.elements; + foreach (e : $Type.values) + { + if (e.#value == value) return e; + } + return SearchResult.MISSING?; +} + <* Mark an expression as likely to be true diff --git a/releasenotes.md b/releasenotes.md index f04565bfa..338c51601 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -36,6 +36,7 @@ - Added `iter()` `value_iter()` and `key_iter()` to HashMap. - Add "tokenizer" to String. - Add "skip_empty" to split methods. Add split_to_buffer method. +- Add `@enum_from_value`. ## 0.6.5 Change list