oss-api-client 1.2.0

A Rust-based object storage service system that provides functionalities similar to Alibaba Cloud OSS. Supports file upload, download, preview, bucket management and more, using Axum as the web framework and SeaORM as the database ORM.
Documentation
use crate::api_client::oss_file_api_client::OssFileApiClient;
use arc_swap::ArcSwap;
use robotech::api_client::{ApiClient, ApiClientConfig, ApiClientError};
use std::collections::HashMap;
use std::sync::{Arc, OnceLock};
use tracing::info;

static OSS_API_CLIENT: OnceLock<ArcSwap<OssApiClient>> = OnceLock::new();

pub struct OssApiClient {
    pub file_client: OssFileApiClient,
}

/// 初始化OssFileApi
pub fn init_oss_api_client(
    api_config: HashMap<String, ApiClientConfig>,
) -> Result<(), ApiClientError> {
    info!("初始化oss的api客户端");
    let oss_api_client = new_oss_api_client_from_config(api_config);
    OSS_API_CLIENT
        .set(ArcSwap::new(Arc::new(oss_api_client)))
        .map_err(|_| ApiClientError::SetApiClient("OSS_API_CLIENT".to_string()))
}

pub fn get_oss_api_client() -> Result<Arc<OssApiClient>, ApiClientError> {
    Ok(OSS_API_CLIENT
        .get()
        .ok_or(ApiClientError::GetApiClient("OSS_API_CLIENT".to_string()))?
        .load_full()
        .clone())
}

pub fn update_oss_api_client(
    api_config: HashMap<String, ApiClientConfig>,
) -> Result<(), ApiClientError> {
    info!("更新oss的api客户端");
    let oss_api_client = new_oss_api_client_from_config(api_config);
    if let Some(swap) = OSS_API_CLIENT.get() {
        swap.store(Arc::new(oss_api_client));
        Ok(())
    } else {
        Err(ApiClientError::NotInit("OSS_API_CLIENT".to_string()))
    }
}

fn new_oss_api_client_from_config(api_config: HashMap<String, ApiClientConfig>) -> OssApiClient {
    let default_config = ApiClientConfig {
        base_url: "http://127.0.0.1:9840".to_string(),
    };
    let api_client_config = api_config.get("oss").unwrap_or(&default_config).clone();
    OssApiClient {
        file_client: OssFileApiClient {
            api_client: ApiClient { api_client_config },
        },
    }
}