Skip to main content

wae_storage/
lib.rs

1//! WAE Storage - 存储服务抽象层
2//!
3//! 提供统一的存储服务抽象,支持 COS、OSS 和本地存储。
4//!
5//! 深度融合 tokio 运行时,支持:
6//! - 异步上传/下载
7//! - 流式处理
8//! - 零拷贝优化
9#![warn(missing_docs)]
10pub mod providers;
11
12use serde::{Deserialize, Serialize};
13pub use wae_types::{WaeError, WaeResult};
14
15use url::Url;
16
17/// 存储操作结果类型
18pub type StorageResult<T> = WaeResult<T>;
19
20/// 存储服务提供商类型
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub enum StorageProviderType {
23    /// 腾讯云 COS
24    Cos,
25    /// 阿里云 OSS
26    Oss,
27    /// 本地存储
28    Local,
29}
30
31/// 存储服务配置
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct StorageConfig {
34    /// 存储服务提供商类型
35    pub provider: StorageProviderType,
36    /// 访问密钥 ID
37    pub secret_id: String,
38    /// 访问密钥
39    pub secret_key: String,
40    /// 存储桶名称
41    pub bucket: String,
42    /// 地域
43    pub region: String,
44    /// 自定义端点
45    pub endpoint: Option<String>,
46    /// CDN 加速域名
47    pub cdn_url: Option<String>,
48}
49
50/// 存储服务提供商 trait
51///
52/// 定义存储服务的基本操作接口
53pub trait StorageProvider: Send + Sync {
54    /// 获取上传预签名 URL
55    fn get_presigned_put_url(&self, key: &str, config: &StorageConfig) -> StorageResult<Url>;
56
57    /// 获取带签名的访问 URL
58    fn sign_url(&self, path: &str, config: &StorageConfig) -> StorageResult<Url>;
59}
60
61pub use providers::{cos::CosProvider, local::LocalStorageProvider, oss::OssProvider};
62
63/// 存储服务
64///
65/// 提供统一的存储服务入口
66pub struct StorageService;
67
68impl StorageService {
69    /// 根据提供商类型获取对应的存储提供商实例
70    pub fn get_provider(provider_type: &StorageProviderType) -> Box<dyn StorageProvider> {
71        match provider_type {
72            StorageProviderType::Cos => Box::new(CosProvider),
73            StorageProviderType::Oss => Box::new(OssProvider),
74            StorageProviderType::Local => Box::new(LocalStorageProvider),
75        }
76    }
77
78    /// 获取带签名的访问 URL
79    pub fn sign_url(path: &str, config: &StorageConfig) -> StorageResult<Url> {
80        let provider = Self::get_provider(&config.provider);
81        provider.sign_url(path, config)
82    }
83
84    /// 获取上传预签名 URL
85    pub fn get_presigned_put_url(key: &str, config: &StorageConfig) -> StorageResult<Url> {
86        let provider = Self::get_provider(&config.provider);
87        provider.get_presigned_put_url(key, config)
88    }
89}