cloud_disk_sync/providers/
aliyun.rs1use crate::config::AccountConfig;
2use crate::core::rate_limit::SlidingWindowRateLimiter;
3use crate::core::traits::RateLimiter;
4use crate::error::{ProviderError, SyncError};
5use crate::providers::{DownloadResult, FileInfo, StorageProvider, UploadResult};
6use async_trait::async_trait;
7use std::path::Path;
8use std::sync::Arc;
9use std::sync::Mutex;
10use std::time::Duration;
11
12pub struct AliYunDriveProvider {
14 client: reqwest::Client,
15 token: String,
16 refresh_token: String,
17 rate_limiter: Arc<dyn RateLimiter>,
18}
19
20impl AliYunDriveProvider {
21 pub async fn new(config: &AccountConfig) -> Result<Self, ProviderError> {
22 let token = config.credentials.get("token");
23
24 match token {
25 None => Err(ProviderError::NotFound("参数异常".into())),
26 Some(token_value) => Ok(Self {
27 client: reqwest::Client::new(),
28 token: token_value.clone(),
29 refresh_token: config
30 .credentials
31 .get("refresh_token")
32 .cloned()
33 .unwrap_or_default(),
34 rate_limiter: Arc::new(SlidingWindowRateLimiter {
35 window_size: Duration::from_secs(1),
36 max_requests: 1u64,
37 requests: Mutex::new(vec![]),
38 }),
39 }),
40 }
41 }
42
43 async fn refresh_token_if_needed(&mut self) -> Result<(), ProviderError> {
44 Ok(())
46 }
47}
48
49#[async_trait]
50impl StorageProvider for AliYunDriveProvider {
51 async fn list(&self, path: &str) -> Result<Vec<FileInfo>, SyncError> {
52 Ok(vec![FileInfo {
53 path: path.to_string(),
54 size: 0,
55 modified: 0,
56 hash: None,
57 is_dir: true,
58 }])
59 }
60 async fn upload(
61 &self,
62 local_path: &Path,
63 remote_path: &str,
64 ) -> Result<UploadResult, SyncError> {
65 Ok(UploadResult::default())
68 }
69
70 async fn download(
71 &self,
72 remote_path: &str,
73 local_path: &Path,
74 ) -> Result<DownloadResult, SyncError> {
75 Ok(DownloadResult::default())
77 }
78
79 async fn delete(&self, path: &str) -> Result<(), SyncError> {
80 Ok(())
81 }
82 async fn mkdir(&self, path: &str) -> Result<(), SyncError> {
83 Ok(())
84 }
85 async fn stat(&self, path: &str) -> Result<FileInfo, SyncError> {
86 Ok(FileInfo {
87 path: path.to_string(),
88 size: 0,
89 modified: 0,
90 hash: None,
91 is_dir: true,
92 })
93 }
94 async fn exists(&self, path: &str) -> Result<bool, SyncError> {
95 Ok(true)
96 }
97}