#[macro_export]
macro_rules! ff_function {
(
$(
$(#[$attr:meta])*
$vis:vis $fn_name:ident (
$args_name:ident : $args_type:ty
) -> $result_type:ty {
keys( $ctx_name:ident : & $ctx_type:ty ) {
$( $key_expr:expr ),* $(,)?
}
argv {
$( $argv_expr:expr ),* $(,)?
}
}
)*
) => {
$(
$(#[$attr])*
$vis async fn $fn_name(
conn: &ferriskey::Client,
$ctx_name: &$ctx_type,
$args_name: &$args_type,
) -> ::core::result::Result<$result_type, $crate::error::ScriptError> {
let keys: ::std::vec::Vec<String> = vec![ $( $key_expr ),* ];
let argv: ::std::vec::Vec<String> = vec![ $( $argv_expr ),* ];
let key_refs: ::std::vec::Vec<&str> = keys.iter().map(|s| s.as_str()).collect();
let argv_refs: ::std::vec::Vec<&str> = argv.iter().map(|s| s.as_str()).collect();
let raw = conn
.fcall::<ferriskey::Value>(stringify!($fn_name), &key_refs, &argv_refs)
.await
.map_err($crate::error::ScriptError::Valkey)?;
<$result_type as $crate::result::FromFcallResult>::from_fcall_result(&raw)
}
)*
};
}