diff --git a/src/macros.rs b/src/macros.rs index 7777d1438c26ff8c770480bee68c179d5490e364..e27cb8c2d16d10bef8c5165b96b8d6d091bde3fe 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -18,4 +18,32 @@ macro_rules! dbg_code { ($code:stmt) => { #[cfg(debug_assertions)] $code } +} + +// Given a function name, return type and variant, will generate the all-so +// common `union_value.as_variant()` method. The return value is the reference +// to the embedded union type. +macro_rules! union_cast_to_ref_method_impl { + ($func_name:ident, $ret_type:ty, $variant:path) => { + fn $func_name(&self) -> &$ret_type { + match self { + $variant(content) => return content, + _ => unreachable!(), + } + } + } +} + +// Another union cast, but now returning a copy of the value +macro_rules! union_cast_to_value_method_impl { + ($func_name:ident, $ret_type:ty, $variant:path) => { + impl Value { + pub(crate) fn $func_name(&self) -> $ret_type { + match self { + $variant(v) => *v, + _ => unreachable!(), + } + } + } + } } \ No newline at end of file