use thiserror::Error;
#[derive(Error, Debug)]
pub enum RustDriveSyncError {
#[error("Arquivo de configuração não encontrado: {path}")]
ConfigNotFound { path: String },
#[error("Configuração inválida: {message}")]
ConfigInvalid { message: String },
#[error("Falha na autenticação: {message}")]
AuthenticationFailed { message: String },
#[error("Token expirado e não foi possível renovar")]
TokenExpired,
#[error("Credenciais não encontradas: {path}")]
CredentialsNotFound { path: String },
#[error("Erro de conexão: {message}")]
NetworkError { message: String },
#[error("Rate limit excedido. Aguarde {retry_after} segundos")]
RateLimitExceeded { retry_after: u64 },
#[error("Timeout na requisição")]
RequestTimeout,
#[error("Arquivo não encontrado: {path}")]
FileNotFound { path: String },
#[error("Erro ao ler arquivo {path}: {message}")]
FileReadError { path: String, message: String },
#[error("Permissão negada: {path}")]
PermissionDenied { path: String },
#[error("Arquivo muito grande: {size} bytes (máximo: {max_size} bytes)")]
FileTooLarge { size: u64, max_size: u64 },
#[error("Pasta de destino não encontrada no Drive: {folder_id}")]
DriveFolderNotFound { folder_id: String },
#[error("Cota do Google Drive excedida")]
DriveQuotaExceeded,
#[error("Erro da API do Google Drive: {message}")]
DriveApiError { message: String },
#[error("Upload falhou após {attempts} tentativas: {message}")]
UploadFailed { attempts: u32, message: String },
#[error("Checksum MD5 não corresponde para {file}: esperado {expected}, obtido {actual}")]
ChecksumMismatch {
file: String,
expected: String,
actual: String,
},
#[error("Verificação de integridade falhou para: {path}")]
IntegrityCheckFailed { path: String },
#[error("Erro no gerenciamento de estado: {message}")]
StateError { message: String },
#[error("Erro de I/O: {0}")]
IoError(#[from] std::io::Error),
#[error("Erro: {0}")]
Other(#[from] anyhow::Error),
}