pub mod models;
use crate::error::Result;
use async_trait::async_trait;
use std::path::Path;
pub use models::{FileInfo, FolderInfo, StorageStats, UploadOptions, UploadResult};
#[async_trait]
pub trait StorageBackend: Send + Sync {
async fn upload_file(
&self,
file_path: &Path,
options: UploadOptions,
) -> Result<UploadResult>;
async fn ensure_folder(&self, name: &str, parent_id: Option<String>) -> Result<FolderInfo>;
async fn ensure_folder_path(&self, path: &str, root_folder_id: String) -> Result<FolderInfo> {
use std::path::Path;
let path_obj = Path::new(path);
let mut current_parent_id = root_folder_id;
let mut last_folder: Option<FolderInfo> = None;
for component in path_obj.components() {
if let Some(name) = component.as_os_str().to_str() {
if name.is_empty() || name == "." {
continue;
}
let folder = self.ensure_folder(name, Some(current_parent_id.clone())).await?;
current_parent_id = folder.id.clone();
last_folder = Some(folder);
}
}
last_folder.ok_or_else(|| crate::error::RustDriveSyncError::DriveApiError {
message: format!("Nenhuma pasta foi criada a partir do caminho: {}", path),
})
}
async fn list_files(&self, folder_id: Option<&str>) -> Result<Vec<FileInfo>>;
async fn file_exists(&self, name: &str, parent_id: Option<String>)
-> Result<Option<String>>;
async fn get_stats(&self) -> Result<StorageStats>;
async fn get_token(&self) -> Result<String>;
}