use crate::config::{AccountConfig, EncryptionConfig, SyncTask};
use crate::core::audit::{AuditFilter, AuditOperation};
use crate::core::health::{ConnectivityStatus, HealthStatus, StorageHealth};
use crate::core::resources::{DiskHandle, MemoryHandle, ResourceLimits, ResourceUsage};
use crate::core::scheduler::ScheduledTask;
use crate::error::{Result, SyncError};
use crate::plugins::hooks::PluginHook;
use crate::report::SyncReport;
use async_trait::async_trait;
use std::path::{Path, PathBuf};
use std::time::Duration;
pub trait StateManager: Send + Sync {
fn save_state(&self, key: &str, value: &[u8]) -> Result<()>;
fn load_state(&self, key: &str) -> Result<Option<Vec<u8>>>;
fn delete_state(&self, key: &str) -> Result<()>;
fn list_states(&self, prefix: &str) -> Result<Vec<String>>;
}
pub trait ProgressReporter: Send + Sync {
fn report_start(&self, total_size: u64, total_files: usize);
fn report_progress(&self, current_size: u64, current_file: &str);
fn report_file_complete(&self, file: &str, size: u64, duration: Duration);
fn report_error(&self, file: &str, error: &SyncError);
fn report_complete(&self, stats: &TransferStats);
}
pub trait RetryStrategy: Send + Sync {
fn should_retry(&self, attempt: u32, error: &SyncError) -> bool;
fn delay_before_retry(&self, attempt: u32) -> Duration;
fn max_attempts(&self) -> u32;
}
#[async_trait]
pub trait RateLimiter: Send + Sync {
async fn acquire<'a>(&'a self) -> Result<()>
where
Self: 'a;
fn current_rate(&self) -> f64; fn set_rate(&mut self, requests_per_second: f64);
fn try_acquire(&self) -> bool;
}
pub trait ChecksumCalculator: Send + Sync {
fn calculate_file_checksum(&self, path: &Path) -> Result<String>;
fn calculate_data_checksum(&self, data: &[u8]) -> String;
fn verify_checksum(&self, path: &Path, expected: &str) -> Result<bool>;
}
pub trait DiffDetector: Send + Sync {
fn detect_changes(
&self,
source_files: &[FileMetadata],
target_files: &[FileMetadata],
options: &DiffOptions,
) -> Result<Vec<FileChange>>;
fn calculate_diff_size(&self, changes: &[FileChange]) -> u64;
}
pub trait FileFilter: Send + Sync {
fn should_include(&self, file: &FileMetadata) -> bool;
fn filter_files(&self, files: &[FileMetadata]) -> Vec<FileMetadata>;
}
#[async_trait]
pub trait TaskScheduler: Send + Sync {
async fn schedule(&self, task: ScheduledTask) -> Result<String>;
async fn cancel(&self, task_id: &str) -> Result<()>;
async fn list_scheduled(&self) -> Result<Vec<ScheduledTask>>;
async fn trigger_now(&self, task_id: &str) -> Result<()>;
}
pub trait Notifier: Send + Sync {
fn notify_success(&self, report: &SyncReport);
fn notify_error(&self, error: &SyncError);
fn notify_warning(&self, warning: &str);
fn notify_progress(&self, progress: &ProgressUpdate);
}
pub trait AuditLogger: Send + Sync {
fn log_operation(&self, operation: AuditOperation);
fn query_operations(
&self,
filter: AuditFilter,
limit: Option<usize>,
) -> Result<Vec<AuditOperation>>;
}
pub trait ConfigValidator: Send + Sync {
fn validate_account(&self, account: &AccountConfig) -> Result<()>;
fn validate_task(&self, task: &SyncTask) -> Result<()>;
fn validate_encryption(&self, config: &EncryptionConfig) -> Result<()>;
}
#[async_trait]
pub trait HealthChecker: Send + Sync {
async fn check_provider_health(&self, provider_id: &str) -> Result<HealthStatus>;
async fn check_storage_health(&self) -> Result<StorageHealth>;
async fn check_connectivity(&self) -> Result<ConnectivityStatus>;
}
pub trait ResourceManager: Send + Sync {
fn allocate_memory(&self, size: usize) -> Result<MemoryHandle>;
fn allocate_disk(&self, size: u64) -> Result<DiskHandle>;
fn current_usage(&self) -> ResourceUsage;
fn set_limits(&self, limits: ResourceLimits);
}
#[async_trait]
pub trait Plugin: Send + Sync {
fn name(&self) -> &str;
fn version(&self) -> &str;
fn description(&self) -> &str;
async fn initialize(&self) -> Result<()>;
async fn shutdown(&self) -> Result<()>;
fn hooks(&self) -> Vec<PluginHook>;
}
#[async_trait]
pub trait HookHandler: Send + Sync {
async fn on_before_sync(&self, task: &SyncTask) -> Result<()>;
async fn on_after_sync(&self, task: &SyncTask, report: &SyncReport) -> Result<()>;
async fn on_file_uploading(&self, file: &FileMetadata) -> Result<()>;
async fn on_file_uploaded(&self, file: &FileMetadata) -> Result<()>;
async fn on_error(&self, error: &SyncError) -> Result<()>;
}
#[derive(Debug, Clone)]
pub struct TransferStats {
pub total_files: usize,
pub successful_files: usize,
pub failed_files: usize,
pub skipped_files: usize,
pub total_bytes: u64,
pub transferred_bytes: u64,
pub average_speed: f64, pub total_duration: Duration,
pub start_time: chrono::DateTime<chrono::Utc>,
pub end_time: chrono::DateTime<chrono::Utc>,
}
#[derive(Debug, Clone)]
pub struct FileMetadata {
pub path: PathBuf,
pub size: u64,
pub modified: i64,
pub created: i64,
pub accessed: i64,
pub checksum: Option<String>,
pub permissions: u32,
pub is_dir: bool,
pub is_symlink: bool,
}
#[derive(Debug, Clone)]
pub enum FileChange {
Added(FileMetadata),
Modified {
old: FileMetadata,
new: FileMetadata,
},
Deleted(FileMetadata),
Moved {
from: FileMetadata,
to: FileMetadata,
},
Unchanged(FileMetadata),
}
#[derive(Debug, Clone)]
pub struct DiffOptions {
pub compare_size: bool,
pub compare_mtime: bool,
pub compare_checksum: bool,
pub ignore_patterns: Vec<String>,
pub max_depth: Option<usize>,
pub follow_symlinks: bool,
}
#[derive(Debug, Clone)]
pub struct ProgressUpdate {
pub current_file: String,
pub current_size: u64,
pub total_size: u64,
pub current_file_index: usize,
pub total_files: usize,
pub speed: f64, pub elapsed: Duration,
pub estimated_remaining: Duration,
}