use crate::functions::defs::FunctionDefinition;
use crate::functions::{DeprecatedFunction, FunctionKind, InternalFunction};
use crate::functions::mf_function::MfFunctionRegistry;
use nohash_hasher::{BuildNoHashHasher, IsEnabled};
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use strum::IntoEnumIterator;
impl IsEnabled for InternalFunction {}
impl IsEnabled for DeprecatedFunction {}
pub struct FunctionRegistry {
internal_functions: HashMap<
InternalFunction,
Rc<dyn FunctionDefinition>,
BuildNoHashHasher<InternalFunction>,
>,
deprecated_functions: HashMap<
DeprecatedFunction,
Rc<dyn FunctionDefinition>,
BuildNoHashHasher<DeprecatedFunction>,
>,
}
impl FunctionRegistry {
thread_local!(
static INSTANCE: RefCell<FunctionRegistry> = RefCell::new(FunctionRegistry::new_internal())
);
pub fn get_definition(
kind: &FunctionKind
) -> Option<Rc<dyn FunctionDefinition>> {
match kind {
FunctionKind::Internal(internal) => Self::INSTANCE
.with_borrow(|i| i.internal_functions.get(&internal).cloned()),
FunctionKind::Deprecated(deprecated) => {
Self::INSTANCE.with_borrow(|i| {
i.deprecated_functions.get(&deprecated).cloned()
})
},
FunctionKind::Closure(_) => None, FunctionKind::Mf(mf) => {
MfFunctionRegistry::get_definition(&mf.name)
},
}
}
fn new_internal() -> Self {
let internal_functions = InternalFunction::iter()
.map(|i| (i.clone(), (&i).into()))
.collect();
let deprecated_functions = DeprecatedFunction::iter()
.map(|i| (i.clone(), (&i).into()))
.collect();
Self { internal_functions, deprecated_functions }
}
}