metacall/
macros.rs

1// Used for documentation.
2#[allow(unused_imports)]
3use crate::MetaCallValue;
4
5pub(crate) mod private_macros {
6    macro_rules! cstring_enum {
7        ($var:ident, $enum:ident) => {{
8            let var = $var.to_string();
9            match ::std::ffi::CString::new(var.clone()) {
10                Ok(str) => Ok(str),
11                Err(err) => Err($enum::UnexpectedCStringConversionErr(
12                    $crate::MetaCallStringConversionError::new(var, err),
13                )),
14            }
15        }};
16
17        ($var:expr, $enum:ident) => {{
18            let var = $var;
19            cstring_enum!(var, $enum)
20        }};
21    }
22
23    macro_rules! cstring {
24        ($var:ident) => {{
25            let var = $var.to_string();
26            match ::std::ffi::CString::new(var.clone()) {
27                Ok(str) => Ok(str),
28                Err(err) => Err($crate::MetaCallStringConversionError::new(var, err)),
29            }
30        }};
31
32        ($var:expr) => {{
33            let var = $var;
34            cstring!(var)
35        }};
36    }
37
38    pub(crate) use cstring;
39    pub(crate) use cstring_enum;
40}
41
42#[macro_export]
43/// Matches [MetaCallValue](MetaCallValue) trait object. For example: ...
44/// ```
45/// use metacall::{metacall_untyped_no_arg, match_metacall_value};
46///
47/// let value = metacall_untyped_no_arg("returns_string_or_number").unwrap();
48/// match_metacall_value!(value, {
49///     str: String => str,
50///     num: i16 => num.to_string(),
51///     num: i32 => num.to_string(),
52///     num: i64 => num.to_string(),
53///     num: f32 => num.to_string(),
54///     num: f64 => num.to_string(),
55///     _ =>  String::from("Invalid output!")
56/// });
57/// ```
58macro_rules! match_metacall_value {
59    ( $any:expr, { $( $var:ident : $type:ty => $arm:expr ),*, _ => $default:expr } ) => (
60        $(
61            if $any.is::<$type>() {
62                let $var = $any.downcast::<$type>().unwrap();
63                $arm
64            } else
65        )*
66        {
67            $default
68        }
69    )
70}
71#[macro_export]
72/// Same as [match_metacall_value](match_metacall_value) but gives a reference. For example: ...
73/// ```
74/// use metacall::{metacall_untyped_no_arg, match_metacall_value_ref};
75///
76/// let value = metacall_untyped_no_arg("returns_string_or_number").unwrap();
77/// match_metacall_value_ref!(value, {
78///     str: String => str.to_owned(),
79///     num: i16 => num.to_string(),
80///     num: i32 => num.to_string(),
81///     num: i64 => num.to_string(),
82///     num: f32 => num.to_string(),
83///     num: f64 => num.to_string(),
84///     _ =>  String::from("Invalid output!")
85/// });
86/// ```
87macro_rules! match_metacall_value_ref {
88    ( $any:expr, { $( $var:ident : $type:ty => $arm:expr ),*, _ => $default:expr } ) => (
89        $(
90            if $any.is::<$type>() {
91                let $var = $any.downcast_ref::<$type>().unwrap();
92                $arm
93            } else
94        )*
95        {
96            $default
97        }
98    )
99}
100#[macro_export]
101/// Same as [match_metacall_value](match_metacall_value) but gives a mutable reference. For example: ...
102/// ```
103/// use metacall::{metacall_untyped_no_arg, match_metacall_value_mut};
104///
105/// let mut value = metacall_untyped_no_arg("returns_string_or_number").unwrap();
106/// match_metacall_value_mut!(value, {
107///     str: String => str.to_owned(),
108///     num: i16 => num.to_string(),
109///     num: i32 => num.to_string(),
110///     num: i64 => num.to_string(),
111///     num: f32 => num.to_string(),
112///     num: f64 => num.to_string(),
113///     _ =>  String::from("Invalid output!")
114/// });
115/// ```
116macro_rules! match_metacall_value_mut {
117    ( $any:expr, { $( $var:ident : $type:ty => $arm:expr ),*, _ => $default:expr } ) => (
118        $(
119            if $any.is::<$type>() {
120                let $var = $any.downcast_mut::<$type>().unwrap();
121                $arm
122            } else
123        )*
124        {
125            $default
126        }
127    )
128}