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}