plux_rs/function/
macros.rs

1/// Macro for convenient function calling with automatic argument conversion.
2///
3/// This macro simplifies calling functions by automatically converting arguments
4/// to Variables and handling the function call syntax.
5///
6/// # Examples
7///
8/// ```rust
9/// use plux_rs::{function_call, function::{Function, DynamicFunction, Arg, FunctionOutput}};
10/// use plux_rs::variable::VariableType;
11///
12/// let add = DynamicFunction::new(
13///     "add",
14///     vec![
15///         Arg::new("a", VariableType::I32),
16///         Arg::new("b", VariableType::I32),
17///     ],
18///     Some(Arg::new("result", VariableType::I32)),
19///     |args| -> FunctionOutput {
20///         let a = args[0].parse_ref::<i32>();
21///         let b = args[1].parse_ref::<i32>();
22///         Ok(Some((a + b).into()))
23///     }
24/// );
25///
26/// // Call with arguments
27/// let result = function_call!(add, 5, 3);
28/// assert_eq!(result.unwrap(), Some(8.into()));
29///
30/// // Call without arguments
31/// let no_args_func = DynamicFunction::new(
32///     "hello",
33///     vec![],
34///     Some(Arg::new("message", VariableType::String)),
35///     |_| -> FunctionOutput { Ok(Some("Hello!".into())) }
36/// );
37/// let message = function_call!(no_args_func);
38/// ```
39#[macro_export]
40macro_rules! function_call {
41	($function: ident, $($args:expr), +) => {
42        // Call a function with multiple arguments
43		$function.call(&[$($args.into()), +])
44	};
45	($function: ident) => {
46        // Call a function with no arguments
47		$function.call(&[])
48	};
49}
50
51#[test]
52fn run() {
53    use crate::{
54        function::{Arg, DynamicFunction, Function, FunctionOutput},
55        variable::VariableType,
56    };
57
58    // Creating a function
59    let func = DynamicFunction::new(
60        "add",
61        vec![
62            Arg::new("a", VariableType::I32),
63            Arg::new("b", VariableType::I32),
64        ],
65        Some(Arg::new("c", VariableType::I32)),
66        |args| -> FunctionOutput {
67            let a = args[0].parse_ref::<i32>();
68            let b = args[1].parse_ref::<i32>();
69
70            let c = a + b;
71
72            println!("{} + {} = {}", a, b, c);
73
74            Ok(Some(c.into()))
75        },
76    );
77
78    // Running the function
79    let c = function_call!(func, 1, 2);
80
81    assert!(c.is_ok());
82    assert_eq!(c.unwrap(), Some(3.into()));
83}