use std::sync::Arc;

use crate::domain::cache::CacheAdapter;

use super::{in_memory::InMemoryAdapter, memcache::MemCacheAdapter, redis::RedisAdapter};

pub struct CacheAdapters {
    pub cache_adapter: Arc<dyn CacheAdapter>,
}

impl CacheAdapters {
    pub fn memcached(client: memcache::Client) -> Self {
        Self {
            cache_adapter: Arc::new(MemCacheAdapter::new(client)),
        }
    }

    pub fn redis(connection: redis::aio::ConnectionManager) -> Self {
        Self {
            cache_adapter: Arc::new(RedisAdapter::new(connection)),
        }
    }

    pub fn in_memory(store: InMemoryAdapter) -> Self {
        Self {
            cache_adapter: Arc::new(store),
        }
    }
}
