Skip to main content

wae_storage/
lib.rs

1//! WAE Storage - 存储服务抽象层
2//!
3//! 提供统一的存储服务抽象,支持 COS、OSS、S3 和本地存储。
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    /// Google Cloud Storage
26    Gcs,
27    /// 阿里云 OSS
28    Oss,
29    /// AWS S3
30    S3,
31    /// 本地存储
32    Local,
33    /// Azure Blob Storage
34    AzureBlob,
35}
36
37/// 存储服务配置
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct StorageConfig {
40    /// 存储服务提供商类型
41    pub provider: StorageProviderType,
42    /// 访问密钥 ID
43    pub secret_id: String,
44    /// 访问密钥
45    pub secret_key: String,
46    /// 存储桶名称
47    pub bucket: String,
48    /// 地域
49    pub region: String,
50    /// 自定义端点
51    pub endpoint: Option<String>,
52    /// CDN 加速域名
53    pub cdn_url: Option<String>,
54}
55
56/// 存储服务提供商 trait
57///
58/// 定义存储服务的基本操作接口
59pub trait StorageProvider: Send + Sync {
60    /// 获取上传预签名 URL
61    fn get_presigned_put_url(&self, key: &str, config: &StorageConfig) -> StorageResult<Url>;
62
63    /// 获取带签名的访问 URL
64    fn sign_url(&self, path: &str, config: &StorageConfig) -> StorageResult<Url>;
65}
66
67pub use providers::{
68    azure_blob::AzureBlobProvider, cos::CosProvider, gcs::GcsProvider, local::LocalStorageProvider, oss::OssProvider,
69    s3::S3Provider,
70};
71
72/// 存储服务
73///
74/// 提供统一的存储服务入口
75pub struct StorageService;
76
77impl StorageService {
78    /// 根据提供商类型获取对应的存储提供商实例
79    pub fn get_provider(provider_type: &StorageProviderType) -> Box<dyn StorageProvider> {
80        match provider_type {
81            StorageProviderType::Cos => Box::new(CosProvider),
82            StorageProviderType::Gcs => Box::new(GcsProvider),
83            StorageProviderType::Oss => Box::new(OssProvider),
84            StorageProviderType::S3 => Box::new(S3Provider),
85            StorageProviderType::Local => Box::new(LocalStorageProvider),
86            StorageProviderType::AzureBlob => Box::new(AzureBlobProvider),
87        }
88    }
89
90    /// 获取带签名的访问 URL
91    pub fn sign_url(path: &str, config: &StorageConfig) -> StorageResult<Url> {
92        let provider = Self::get_provider(&config.provider);
93        provider.sign_url(path, config)
94    }
95
96    /// 获取上传预签名 URL
97    pub fn get_presigned_put_url(key: &str, config: &StorageConfig) -> StorageResult<Url> {
98        let provider = Self::get_provider(&config.provider);
99        provider.get_presigned_put_url(key, config)
100    }
101}