pub use mini_template_macro::create_modifier;
#[macro_export]
macro_rules! fn_as_modifier {
(fn $modifier_name: ident ($first_name:ident: $first_t: ty $($(,$name: ident: $t: ty $(= $default: expr)?)+)?) -> $return: ty => $func: path) => {
#[allow(unused_variables)]
pub fn $modifier_name(value: &$crate::value::Value, args: Vec<&$crate::value::Value>) -> $crate::modifier::error::Result<$crate::value::Value> {
use $crate::modifier::error::Error;
let $first_name: $first_t = fn_as_modifier!(try_into value: $first_t);
$(
let mut args = args.into_iter();
$(
let $name: $t = match args.next() {
Some($name) => fn_as_modifier!(try_into $name: $t),
None => fn_as_modifier!(default_value $name $($default)?)
};
)+
)?
let result = $func($first_name $($(,$name)+)?);
Ok(result.into())
}
};
(default_value $arg_name: ident) => {
return Err(Error::MissingArgument{argument_name: stringify!($arg_name)})
};
(default_value $arg_name: ident $default: tt) => {
$default
};
(try_into $value: ident: $type: ty) => {
match $value.try_into() {
Ok(inner) => inner,
Err(e) => return Err(Error::Type{value: $value.to_string(), type_error: e})
}
}
}