atproto-calendar-import is a library and CLI tool for importing calendar events in python & rust
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>;