#[macro_export]
macro_rules! functions {
($(
$(#[doc = $doc: literal])* $name: literal ($argc: tt) => $callback: expr)
*) => {
pub fn functions() -> std::vec::Vec<(&'static str, $crate::prelude::Function)> {
$(
$crate::check_nonempty_doc! {
$(#[doc = $doc])* $name
}
)*
std::vec![
$((
$name,
$crate::prelude::Function::new(
[$($doc),*].map(str::trim_start).join("\n"),
$crate::make_argc!($argc),
$callback,
),
)),*
]
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! check_nonempty_doc {
($name: literal) => {
compile_error!(concat!(
"builtin function ",
stringify!($name),
" has no documentation"
));
};
($(#[doc = $doc: literal])* $name: literal) => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! make_argc {
(_) => {
None
};
($num: literal) => {
Some($num)
};
}