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}