use once_cell::sync::OnceCell;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct BuiltinsGuard {
pub total_registered: usize,
}
static BUILTINS_LOADED: OnceCell<BuiltinsGuard> = OnceCell::new();
pub fn ensure_builtins_loaded() -> &'static BuiltinsGuard {
BUILTINS_LOADED.get_or_init(|| {
formualizer_eval::builtins::load_builtins();
#[cfg(feature = "io_builtins")]
{
let _ = load_io_builtins();
}
BuiltinsGuard {
total_registered: 0,
}
})
}
pub fn try_load_builtins() -> Result<BuiltinsGuard, &'static str> {
if BUILTINS_LOADED.get().is_some() {
return Err("Builtins already loaded");
}
formualizer_eval::builtins::load_builtins();
#[cfg(feature = "io_builtins")]
{
let _ = load_io_builtins();
}
let guard = BuiltinsGuard {
total_registered: 0,
};
BUILTINS_LOADED
.set(guard.clone())
.map_err(|_| "Race condition in builtin loading")?;
Ok(guard)
}
pub fn register_function_dynamic(f: Arc<dyn formualizer_eval::function::Function>) {
ensure_builtins_loaded();
formualizer_eval::function_registry::register_function(f);
}
#[cfg(feature = "io_builtins")]
pub fn load_io_builtins() -> usize {
0usize
}