use crate::client::CacheOps;
use dashmap::DashMap;
use std::sync::Arc;
use std::sync::OnceLock;
static CACHE_REGISTRY: OnceLock<DashMap<String, Arc<dyn CacheOps + Send + Sync>>> = OnceLock::new();
fn get_registry() -> &'static DashMap<String, Arc<dyn CacheOps + Send + Sync>> {
CACHE_REGISTRY.get_or_init(DashMap::new)
}
#[doc(hidden)]
pub fn __internal_register_cache(service_name: &str, cache: Arc<dyn CacheOps + Send + Sync>) {
get_registry().insert(service_name.to_string(), cache);
}
#[doc(hidden)]
pub fn __internal_get_cache(service_name: &str) -> Option<Arc<dyn CacheOps + Send + Sync>> {
get_registry().get(service_name).map(|r| r.value().clone())
}
#[doc(hidden)]
pub fn __internal_remove_cache(service_name: &str) {
let _ = get_registry().remove(service_name);
}
#[doc(hidden)]
pub async fn __internal_clear_all() {
let registry = get_registry();
for entry in registry.iter() {
let cache = entry.value();
let _ = cache.shutdown().await;
}
registry.clear();
}
pub fn get_l1_feature_info() -> &'static str {
#[cfg(feature = "l1-moka")]
{
"L1 Cache (Moka): Enabled"
}
#[cfg(not(feature = "l1-moka"))]
{
"L1 Cache (Moka): Disabled (enable with 'l1-moka' feature)"
}
}
pub fn get_l2_feature_info() -> &'static str {
#[cfg(feature = "l2-redis")]
{
"L2 Cache (Redis): Enabled"
}
#[cfg(not(feature = "l2-redis"))]
{
"L2 Cache (Redis): Disabled (enable with 'l2-redis' feature)"
}
}
pub fn get_all_feature_info() -> Vec<&'static str> {
vec![get_l1_feature_info(), get_l2_feature_info()]
}
pub fn is_l1_enabled() -> bool {
cfg!(feature = "l1-moka")
}
pub fn is_l2_enabled() -> bool {
cfg!(feature = "l2-redis")
}