microrust_inject 0.0.0-alpha.6

MicroRust Dependency Injection
Documentation
use dashmap::DashMap;
use std::{
    any::{Any, TypeId},
    sync::{Arc, LazyLock},
};

static __STRUCT_REGISTRY: LazyLock<DashMap<TypeId, Arc<fn() -> Arc<dyn Any + Send + Sync>>>> =
    LazyLock::new(DashMap::<_, _>::new);

#[doc(hidden)]
pub trait __InstanceFactory: Send + Sync {
    fn __create_instance() -> Arc<dyn Any + Send + Sync>
    where
        Self: Send + Sync + Sized;
}

#[doc(hidden)]
pub fn __collect_struct<T: __InstanceFactory + Send + Sync + 'static>() {
    println!("__collect_struct() called");

    let type_id = TypeId::of::<T>();
    if __contains_function_pointer(&type_id) {
        println!("struct allready collected");
        return;
    }

    let fp = T::__create_instance;
    __insert_function_pointer(type_id, fp);
}

#[doc(hidden)]
pub fn __get_function_pointer(type_id: TypeId) -> Arc<fn() -> Arc<dyn Any + Send + Sync>> {
    println!("__get_function_pointer() called");

    let value = __STRUCT_REGISTRY.get(&type_id).unwrap();
    value.clone()
}

#[doc(hidden)]
pub fn __contains_function_pointer(type_id: &TypeId) -> bool {
    __STRUCT_REGISTRY.contains_key(type_id)
}

#[doc(hidden)]
pub fn __insert_function_pointer(
    type_id: TypeId,
    fp: fn() -> Arc<dyn Any + Send + Sync + 'static>,
) {
    // Todo Arc:pin(fp)
    __STRUCT_REGISTRY.insert(type_id, Arc::new(fp));
}