atproto-calendar-import is a library and CLI tool for importing calendar events in python & rust
at main 139 lines 5.1 kB view raw
1//! Centralized error definitions for atproto-calendar-import 2//! 3//! All errors follow the format: `error-atproto-calendar-<domain>-<code> <msg>: <details>` 4 5use thiserror::Error; 6 7#[derive(Debug, Error)] 8pub enum CalendarImportError { 9 // Authentication errors (1xx) 10 #[error("error-atproto-calendar-auth-101 OAuth2 token retrieval failed: {0}")] 11 OAuth2TokenFailed(String), 12 13 #[error("error-atproto-calendar-auth-102 Invalid access token: {0}")] 14 InvalidAccessToken(String), 15 16 #[error("error-atproto-calendar-auth-103 Token refresh failed: {0}")] 17 TokenRefreshFailed(String), 18 19 #[error("error-atproto-calendar-auth-104 AT Protocol authentication failed: {0}")] 20 AtProtocolAuthFailed(String), 21 22 // Import errors (2xx) 23 #[error("error-atproto-calendar-import-201 Google Calendar API request failed: {0}")] 24 GoogleApiError(String), 25 26 #[error("error-atproto-calendar-import-202 Outlook Graph API request failed: {0}")] 27 OutlookApiError(String), 28 29 #[error("error-atproto-calendar-import-203 Failed to parse calendar event: {0}")] 30 EventParseError(String), 31 32 #[error("error-atproto-calendar-import-204 Network request failed: {0}")] 33 NetworkError(String), 34 35 #[error("error-atproto-calendar-import-205 Rate limit exceeded for provider: {0}")] 36 RateLimitExceeded(String), 37 38 // Transform errors (3xx) 39 #[error("error-atproto-calendar-transform-301 Invalid datetime format: {0}")] 40 InvalidDateTimeFormat(String), 41 42 #[error("error-atproto-calendar-transform-302 Missing required field: {0}")] 43 MissingRequiredField(String), 44 45 #[error("error-atproto-calendar-transform-303 Field validation failed: {field} - {reason}")] 46 FieldValidationError { field: String, reason: String }, 47 48 #[error("error-atproto-calendar-transform-304 Event serialization failed: {0}")] 49 SerializationError(String), 50 51 // PDS errors (4xx) 52 #[error("error-atproto-calendar-pds-401 Failed to connect to PDS: {0}")] 53 PdsConnectionError(String), 54 55 #[error("error-atproto-calendar-pds-402 Failed to write record to repository: {0}")] 56 PdsWriteError(String), 57 58 #[error("error-atproto-calendar-pds-403 Repository not found: {0}")] 59 RepositoryNotFound(String), 60 61 #[error("error-atproto-calendar-pds-404 Invalid collection name: {0}")] 62 InvalidCollection(String), 63 64 #[error("error-atproto-calendar-pds-405 Record validation failed: {0}")] 65 RecordValidationError(String), 66 67 // Deduplication errors (5xx) 68 #[error("error-atproto-calendar-dedup-501 Failed to access cache: {0}")] 69 CacheAccessError(String), 70 71 #[error("error-atproto-calendar-dedup-502 Hash generation failed: {0}")] 72 HashGenerationError(String), 73 74 #[error("error-atproto-calendar-dedup-503 Cache corruption detected: {0}")] 75 CacheCorruption(String), 76 77 // Configuration errors (6xx) 78 #[error("error-atproto-calendar-config-601 Missing environment variable: {0}")] 79 MissingEnvironmentVariable(String), 80 81 #[error("error-atproto-calendar-config-602 Invalid configuration value: {key} - {reason}")] 82 InvalidConfigValue { key: String, reason: String }, 83 84 #[error("error-atproto-calendar-config-603 Configuration file not found: {0}")] 85 ConfigFileNotFound(String), 86 87 // General errors (9xx) 88 #[error("error-atproto-calendar-general-901 Internal error: {0}")] 89 InternalError(String), 90 91 #[error("error-atproto-calendar-general-902 Operation timeout: {0}")] 92 TimeoutError(String), 93 94 #[error("error-atproto-calendar-general-903 Feature not implemented: {0}")] 95 NotImplemented(String), 96} 97 98impl From<reqwest::Error> for CalendarImportError { 99 fn from(error: reqwest::Error) -> Self { 100 CalendarImportError::NetworkError(error.to_string()) 101 } 102} 103 104impl From<serde_json::Error> for CalendarImportError { 105 fn from(error: serde_json::Error) -> Self { 106 CalendarImportError::SerializationError(error.to_string()) 107 } 108} 109 110impl From<chrono::ParseError> for CalendarImportError { 111 fn from(error: chrono::ParseError) -> Self { 112 CalendarImportError::InvalidDateTimeFormat(error.to_string()) 113 } 114} 115 116impl From<std::env::VarError> for CalendarImportError { 117 fn from(error: std::env::VarError) -> Self { 118 match error { 119 std::env::VarError::NotPresent => { 120 CalendarImportError::MissingEnvironmentVariable("Variable not set".to_string()) 121 } 122 std::env::VarError::NotUnicode(_) => { 123 CalendarImportError::InvalidConfigValue { 124 key: "environment_variable".to_string(), 125 reason: "Contains invalid Unicode".to_string(), 126 } 127 } 128 } 129 } 130} 131 132impl From<anyhow::Error> for CalendarImportError { 133 fn from(error: anyhow::Error) -> Self { 134 CalendarImportError::InternalError(error.to_string()) 135 } 136} 137 138/// Result type alias for this crate 139pub type Result<T> = std::result::Result<T, CalendarImportError>;