1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::{
    collections::HashMap,
    sync::{Arc, OnceLock},
};

use tardis::{
    basic::{error::TardisError, result::TardisResult},
    cache::cache_client::TardisCacheClient,
    tokio::sync::RwLock,
};

pub fn cache_clients() -> &'static RwLock<HashMap<String, Arc<TardisCacheClient>>> {
    static CACHE_CLIENTS: OnceLock<RwLock<HashMap<String, Arc<TardisCacheClient>>>> = OnceLock::new();
    CACHE_CLIENTS.get_or_init(Default::default)
}

pub async fn init(name: impl Into<String>, url: &str) -> TardisResult<()> {
    let cache = TardisCacheClient::init(url).await?;
    {
        let mut write = cache_clients().write().await;
        write.insert(name.into(), Arc::new(cache));
    }
    Ok(())
}

pub async fn remove(name: &str) -> TardisResult<()> {
    {
        let mut write = cache_clients().write().await;
        write.remove(name);
    }
    Ok(())
}

pub async fn get(name: &str) -> TardisResult<Arc<TardisCacheClient>> {
    {
        let read = cache_clients().read().await;
        read.get(name).cloned().ok_or_else(|| TardisError::bad_request("[SG.server] Get client failed", ""))
    }
}