1use jacquard_common::session::SessionStoreError;
2use miette::Diagnostic;
3
4use crate::request::RequestError;
5use crate::resolver::ResolverError;
6
7/// High-level errors emitted by OAuth helpers.
8#[derive(Debug, thiserror::Error, Diagnostic)]
9pub enum OAuthError {
10 #[error(transparent)]
11 #[diagnostic(code(jacquard_oauth::resolver))]
12 Resolver(#[from] ResolverError),
13
14 #[error(transparent)]
15 #[diagnostic(code(jacquard_oauth::request))]
16 Request(#[from] RequestError),
17
18 #[error(transparent)]
19 #[diagnostic(code(jacquard_oauth::storage))]
20 Storage(#[from] SessionStoreError),
21
22 #[error(transparent)]
23 #[diagnostic(code(jacquard_oauth::dpop))]
24 Dpop(#[from] crate::dpop::Error),
25
26 #[error(transparent)]
27 #[diagnostic(code(jacquard_oauth::keyset))]
28 Keyset(#[from] crate::keyset::Error),
29
30 #[error(transparent)]
31 #[diagnostic(code(jacquard_oauth::atproto))]
32 Atproto(#[from] crate::atproto::Error),
33
34 #[error(transparent)]
35 #[diagnostic(code(jacquard_oauth::session))]
36 Session(#[from] crate::session::Error),
37
38 #[error(transparent)]
39 #[diagnostic(code(jacquard_oauth::serde_json))]
40 SerdeJson(#[from] serde_json::Error),
41
42 #[error(transparent)]
43 #[diagnostic(code(jacquard_oauth::url))]
44 Url(#[from] url::ParseError),
45
46 #[error(transparent)]
47 #[diagnostic(code(jacquard_oauth::form))]
48 Form(#[from] serde_html_form::ser::Error),
49
50 #[error(transparent)]
51 #[diagnostic(code(jacquard_oauth::callback))]
52 Callback(#[from] CallbackError),
53}
54
55/// Typed callback validation errors (redirect handling).
56#[derive(Debug, thiserror::Error, Diagnostic)]
57pub enum CallbackError {
58 #[error("missing state parameter in callback")]
59 #[diagnostic(code(jacquard_oauth::callback::missing_state))]
60 MissingState,
61 #[error("missing `iss` parameter")]
62 #[diagnostic(code(jacquard_oauth::callback::missing_iss))]
63 MissingIssuer,
64 #[error("issuer mismatch: expected {expected}, got {got}")]
65 #[diagnostic(code(jacquard_oauth::callback::issuer_mismatch))]
66 IssuerMismatch { expected: String, got: String },
67 #[error("timeout")]
68 #[diagnostic(code(jacquard_oauth::callback::timeout))]
69 Timeout,
70}
71
72pub type Result<T> = core::result::Result<T, OAuthError>;