macro_rules! make_udf_function {
($udf_impl:ty, $expr_fn_name:ident, $($arg:ident)*, $doc:expr) => {
paste::paste! {
#[doc = $doc]
#[must_use] pub fn $expr_fn_name($($arg: datafusion::logical_expr::Expr),*) -> datafusion::logical_expr::Expr {
datafusion::logical_expr::Expr::ScalarFunction(datafusion::logical_expr::expr::ScalarFunction::new_udf(
[< $expr_fn_name _udf >](),
vec![$($arg),*],
))
}
static [< STATIC_ $expr_fn_name:upper >]: std::sync::OnceLock<std::sync::Arc<datafusion::logical_expr::ScalarUDF>> =
std::sync::OnceLock::new();
pub fn [< $expr_fn_name _udf >]() -> std::sync::Arc<datafusion::logical_expr::ScalarUDF> {
[< STATIC_ $expr_fn_name:upper >]
.get_or_init(|| {
std::sync::Arc::new(datafusion::logical_expr::ScalarUDF::new_from_impl(
<$udf_impl>::default(),
))
})
.clone()
}
}
};
}
pub(crate) use make_udf_function;