A library for ATProtocol identities.
1//! # Structured Error Types for OAuth Axum Handlers
2//!
3//! Comprehensive error handling for AT Protocol OAuth Axum web handlers using structured error types
4//! with the `thiserror` library. All errors follow the project convention of prefixed error codes
5//! with descriptive messages.
6//!
7//! ## Error Categories
8//!
9//! - **`OAuthCallbackError`** (callback-1 to callback-7): OAuth callback handler errors
10//! - **`OAuthLoginError`** (login-1 to login-11): OAuth login CLI tool errors
11//!
12//! ## Error Format
13//!
14//! All errors use the standardized format: `error-atproto-oauth-axum-{domain}-{number} {message}: {details}`
15
16use thiserror::Error;
17
18/// Error types that can occur during OAuth callback handling.
19///
20/// These errors represent failures in the OAuth authorization callback flow
21/// including request validation and token exchange operations.
22#[derive(Debug, Error)]
23pub enum OAuthCallbackError {
24 /// Occurs when no OAuth request is found for the provided state parameter
25 #[error("error-atproto-oauth-axum-callback-1 No OAuth request found for state")]
26 NoOAuthRequestFound,
27
28 /// Occurs when the issuer in the callback doesn't match the stored OAuth request
29 #[error(
30 "error-atproto-oauth-axum-callback-2 Invalid issuer: expected {expected}, got {actual}"
31 )]
32 InvalidIssuer {
33 /// The expected issuer from the stored OAuth request
34 expected: String,
35 /// The actual issuer from the callback
36 actual: String,
37 },
38
39 /// Occurs when no DID document is found for the OAuth request
40 #[error("error-atproto-oauth-axum-callback-3 No DID document found for OAuth request")]
41 NoDIDDocumentFound,
42
43 /// Occurs when no signing key is found for the OAuth request
44 #[error("error-atproto-oauth-axum-callback-4 No signing key found for OAuth request")]
45 NoSigningKeyFound,
46
47 /// Occurs when an underlying operation fails with an anyhow error
48 #[error("error-atproto-oauth-axum-callback-5 Operation failed: {error}")]
49 OperationFailed {
50 /// The underlying anyhow error
51 error: anyhow::Error,
52 },
53
54 /// Occurs when key operations fail
55 #[error("error-atproto-oauth-axum-callback-6 Key operation failed: {error}")]
56 KeyOperationFailed {
57 /// The underlying key error
58 error: atproto_identity::errors::KeyError,
59 },
60
61 /// Occurs when OAuth client operations fail
62 #[error("error-atproto-oauth-axum-callback-7 OAuth client operation failed: {error}")]
63 OAuthClientOperationFailed {
64 /// The underlying OAuth client error
65 error: atproto_oauth::errors::OAuthClientError,
66 },
67}
68
69impl From<anyhow::Error> for OAuthCallbackError {
70 fn from(error: anyhow::Error) -> Self {
71 OAuthCallbackError::OperationFailed { error }
72 }
73}
74
75impl From<atproto_identity::errors::KeyError> for OAuthCallbackError {
76 fn from(error: atproto_identity::errors::KeyError) -> Self {
77 OAuthCallbackError::KeyOperationFailed { error }
78 }
79}
80
81impl From<atproto_oauth::errors::OAuthClientError> for OAuthCallbackError {
82 fn from(error: atproto_oauth::errors::OAuthClientError) -> Self {
83 OAuthCallbackError::OAuthClientOperationFailed { error }
84 }
85}
86
87/// Error types that can occur during OAuth login CLI operations.
88///
89/// These errors represent failures in the OAuth login command-line tool
90/// including subject resolution, DID operations, and OAuth flow initiation.
91#[derive(Debug, Error)]
92pub enum OAuthLoginError {
93 /// Occurs when subject resolution fails
94 #[error("error-atproto-oauth-axum-login-1 Failed to resolve subject: {error}")]
95 SubjectResolutionFailed {
96 /// The underlying resolution error
97 error: anyhow::Error,
98 },
99
100 /// Occurs when PLC directory query fails
101 #[error("error-atproto-oauth-axum-login-2 Failed to query PLC directory: {error}")]
102 PLCQueryFailed {
103 /// The underlying PLC error
104 error: anyhow::Error,
105 },
106
107 /// Occurs when web DID query fails
108 #[error("error-atproto-oauth-axum-login-3 Failed to query web DID: {error}")]
109 WebDIDQueryFailed {
110 /// The underlying web DID error
111 error: anyhow::Error,
112 },
113
114 /// Occurs when an unsupported DID method is encountered
115 #[error("error-atproto-oauth-axum-login-4 Unsupported DID method: {did}")]
116 UnsupportedDIDMethod {
117 /// The unsupported DID identifier
118 did: String,
119 },
120
121 /// Occurs when no PDS endpoint is found in the DID document
122 #[error("error-atproto-oauth-axum-login-5 No PDS endpoint found in DID document")]
123 NoPDSEndpointFound,
124
125 /// Occurs when PDS resources retrieval fails
126 #[error("error-atproto-oauth-axum-login-6 Failed to get PDS resources: {error}")]
127 PDSResourcesFailed {
128 /// The underlying PDS resources error
129 error: anyhow::Error,
130 },
131
132 /// Occurs when DPoP key generation fails
133 #[error("error-atproto-oauth-axum-login-7 Failed to generate DPoP key: {error}")]
134 DPoPKeyGenerationFailed {
135 /// The underlying key generation error
136 error: anyhow::Error,
137 },
138
139 /// Occurs when private signing key parsing fails
140 #[error("error-atproto-oauth-axum-login-8 Invalid private signing key: {error}")]
141 InvalidPrivateSigningKey {
142 /// The underlying key parsing error
143 error: anyhow::Error,
144 },
145
146 /// Occurs when OAuth initialization fails
147 #[error("error-atproto-oauth-axum-login-9 OAuth init failed: {error}")]
148 OAuthInitFailed {
149 /// The underlying OAuth initialization error
150 error: anyhow::Error,
151 },
152
153 /// Occurs when public key derivation fails
154 #[error("error-atproto-oauth-axum-login-10 Failed to derive public key: {error}")]
155 PublicKeyDerivationFailed {
156 /// The underlying key derivation error
157 error: anyhow::Error,
158 },
159
160 /// Occurs when OAuth request storage fails
161 #[error("error-atproto-oauth-axum-login-11 Failed to store OAuth request: {error}")]
162 OAuthRequestStorageFailed {
163 /// The underlying storage error
164 error: anyhow::Error,
165 },
166}