Skip to main content

oss_api_client/api_client/
oss_api_client_utils.rs

1use crate::api_client::oss_file_api_client::OssFileApiClient;
2use arc_swap::ArcSwapOption;
3use config::Value;
4use robotech::api_client::{ApiClient, ApiClientConfig, API_CLIENT_CONFIG_KEY};
5use robotech::cfg::CfgError;
6use std::collections::HashMap;
7use std::sync::Arc;
8use tracing::info;
9use wheel_rs::config_utils::has_config_changed;
10
11static OSS_API_CLIENT: ArcSwapOption<OssApiClient> = ArcSwapOption::const_empty();
12
13pub struct OssApiClient {
14    pub file_client: OssFileApiClient,
15}
16
17pub fn get_oss_api_client() -> Result<Arc<OssApiClient>, CfgError> {
18    OSS_API_CLIENT.load_full().ok_or(CfgError::NotInit(
19        "OSS_API_CLIENT not initialized".to_string(),
20    ))
21}
22
23pub fn setup_oss_api_client(
24    api_config: HashMap<String, ApiClientConfig>,
25    changed: &Option<HashMap<String, Value>>,
26) {
27    info!("setup oss api client...: {api_config:?}");
28    if changed
29        .as_ref()
30        .map(|changed| has_config_changed(API_CLIENT_CONFIG_KEY, changed))
31        .unwrap_or(true)
32    {
33        let oss_api_client = new_oss_api_client_from_config(api_config);
34        OSS_API_CLIENT.store(Some(Arc::new(oss_api_client)));
35    }
36}
37
38fn new_oss_api_client_from_config(api_config: HashMap<String, ApiClientConfig>) -> OssApiClient {
39    let default_config = ApiClientConfig {
40        base_url: "http://127.0.0.1:9840".to_string(),
41    };
42    let api_client_config = api_config
43        .get(API_CLIENT_CONFIG_KEY)
44        .unwrap_or(&default_config)
45        .clone();
46    OssApiClient {
47        file_client: OssFileApiClient {
48            api_client: ApiClient { api_client_config },
49        },
50    }
51}