A better Rust ATProto crate
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>;