//! Centralized error definitions for atproto-calendar-import //! //! All errors follow the format: `error-atproto-calendar-- :
` use thiserror::Error; #[derive(Debug, Error)] pub enum CalendarImportError { // Authentication errors (1xx) #[error("error-atproto-calendar-auth-101 OAuth2 token retrieval failed: {0}")] OAuth2TokenFailed(String), #[error("error-atproto-calendar-auth-102 Invalid access token: {0}")] InvalidAccessToken(String), #[error("error-atproto-calendar-auth-103 Token refresh failed: {0}")] TokenRefreshFailed(String), #[error("error-atproto-calendar-auth-104 AT Protocol authentication failed: {0}")] AtProtocolAuthFailed(String), // Import errors (2xx) #[error("error-atproto-calendar-import-201 Google Calendar API request failed: {0}")] GoogleApiError(String), #[error("error-atproto-calendar-import-202 Outlook Graph API request failed: {0}")] OutlookApiError(String), #[error("error-atproto-calendar-import-203 Failed to parse calendar event: {0}")] EventParseError(String), #[error("error-atproto-calendar-import-204 Network request failed: {0}")] NetworkError(String), #[error("error-atproto-calendar-import-205 Rate limit exceeded for provider: {0}")] RateLimitExceeded(String), // Transform errors (3xx) #[error("error-atproto-calendar-transform-301 Invalid datetime format: {0}")] InvalidDateTimeFormat(String), #[error("error-atproto-calendar-transform-302 Missing required field: {0}")] MissingRequiredField(String), #[error("error-atproto-calendar-transform-303 Field validation failed: {field} - {reason}")] FieldValidationError { field: String, reason: String }, #[error("error-atproto-calendar-transform-304 Event serialization failed: {0}")] SerializationError(String), // PDS errors (4xx) #[error("error-atproto-calendar-pds-401 Failed to connect to PDS: {0}")] PdsConnectionError(String), #[error("error-atproto-calendar-pds-402 Failed to write record to repository: {0}")] PdsWriteError(String), #[error("error-atproto-calendar-pds-403 Repository not found: {0}")] RepositoryNotFound(String), #[error("error-atproto-calendar-pds-404 Invalid collection name: {0}")] InvalidCollection(String), #[error("error-atproto-calendar-pds-405 Record validation failed: {0}")] RecordValidationError(String), // Deduplication errors (5xx) #[error("error-atproto-calendar-dedup-501 Failed to access cache: {0}")] CacheAccessError(String), #[error("error-atproto-calendar-dedup-502 Hash generation failed: {0}")] HashGenerationError(String), #[error("error-atproto-calendar-dedup-503 Cache corruption detected: {0}")] CacheCorruption(String), // Configuration errors (6xx) #[error("error-atproto-calendar-config-601 Missing environment variable: {0}")] MissingEnvironmentVariable(String), #[error("error-atproto-calendar-config-602 Invalid configuration value: {key} - {reason}")] InvalidConfigValue { key: String, reason: String }, #[error("error-atproto-calendar-config-603 Configuration file not found: {0}")] ConfigFileNotFound(String), // General errors (9xx) #[error("error-atproto-calendar-general-901 Internal error: {0}")] InternalError(String), #[error("error-atproto-calendar-general-902 Operation timeout: {0}")] TimeoutError(String), #[error("error-atproto-calendar-general-903 Feature not implemented: {0}")] NotImplemented(String), } impl From for CalendarImportError { fn from(error: reqwest::Error) -> Self { CalendarImportError::NetworkError(error.to_string()) } } impl From for CalendarImportError { fn from(error: serde_json::Error) -> Self { CalendarImportError::SerializationError(error.to_string()) } } impl From for CalendarImportError { fn from(error: chrono::ParseError) -> Self { CalendarImportError::InvalidDateTimeFormat(error.to_string()) } } impl From for CalendarImportError { fn from(error: std::env::VarError) -> Self { match error { std::env::VarError::NotPresent => { CalendarImportError::MissingEnvironmentVariable("Variable not set".to_string()) } std::env::VarError::NotUnicode(_) => { CalendarImportError::InvalidConfigValue { key: "environment_variable".to_string(), reason: "Contains invalid Unicode".to_string(), } } } } } impl From for CalendarImportError { fn from(error: anyhow::Error) -> Self { CalendarImportError::InternalError(error.to_string()) } } /// Result type alias for this crate pub type Result = std::result::Result;