Skip to main content

wae_storage/providers/
local.rs

1//! 本地存储提供商实现
2
3use crate::{StorageConfig, StorageProvider, StorageResult};
4
5use url::Url;
6use wae_types::WaeError;
7
8/// 本地存储提供商
9///
10/// 用于本地开发环境的简单存储实现
11pub struct LocalStorageProvider;
12
13impl StorageProvider for LocalStorageProvider {
14    fn sign_url(&self, path: &str, config: &StorageConfig) -> StorageResult<Url> {
15        if path.is_empty() {
16            return Err(WaeError::invalid_params("path", "Empty path"));
17        }
18
19        if path.starts_with("http://") || path.starts_with("https://") {
20            return Url::parse(path).map_err(|e| WaeError::invalid_params("path", e.to_string()));
21        }
22
23        let base_url_str = config.cdn_url.as_deref().unwrap_or("http://localhost:3000/uploads");
24
25        let base_url = Url::parse(base_url_str).map_err(|e| WaeError::invalid_params("base_url", e.to_string()))?;
26        let url = base_url.join(path.trim_start_matches('/')).map_err(|e| WaeError::invalid_params("url", e.to_string()))?;
27
28        Ok(url)
29    }
30
31    fn get_presigned_put_url(&self, key: &str, config: &StorageConfig) -> StorageResult<Url> {
32        let base_url_str = config.endpoint.as_deref().unwrap_or("http://localhost:3000/api/upload");
33
34        let base_url = Url::parse(base_url_str).map_err(|e| WaeError::invalid_params("base_url", e.to_string()))?;
35        let url = base_url.join(key.trim_start_matches('/')).map_err(|e| WaeError::invalid_params("url", e.to_string()))?;
36
37        Ok(url)
38    }
39}