1use oauth2::{
2 basic::BasicErrorResponseType,
3 url::{ParseError, Url},
4 RequestTokenError, StandardErrorResponse,
5};
6use thiserror::Error;
7
8pub type Result<T> = std::result::Result<T, Error>;
10
11#[derive(Error, Debug)]
13pub enum Error {
14 #[error("cannot read response body")]
15 ReadResponseBodyError(#[source] http::Error),
16 #[error("cannot build auth url")]
17 BuildAuthUrlError(#[source] oauth2::url::ParseError),
18 #[error("cannot build token url")]
19 BuildTokenUrlError(#[source] oauth2::url::ParseError),
20 #[error("cannot build revocation url")]
21 BuildRevocationUrlError(#[source] oauth2::url::ParseError),
22 #[error("cannot build introspection url")]
23 BuildIntrospectionUrlError(#[source] oauth2::url::ParseError),
24 #[error("cannot build redirect url")]
25 BuildRedirectUrlError(#[source] oauth2::url::ParseError),
26 #[error("cannot bind redirect server")]
27 BindRedirectServerError(String, u16, #[source] std::io::Error),
28 #[error("cannot accept redirect server connections")]
29 AcceptRedirectServerError(#[source] std::io::Error),
30 #[error("invalid state {0}: expected {1}")]
31 InvalidStateError(String, String),
32 #[error("missing redirect url from {0}")]
33 MissingRedirectUrlError(String),
34 #[error("cannot parse redirect url {1}")]
35 ParseRedirectUrlError(#[source] ParseError, String),
36 #[error("cannot find code from redirect url {0}")]
37 FindCodeInRedirectUrlError(Url),
38 #[error("cannot find state from redirect url {0}")]
39 FindStateInRedirectUrlError(Url),
40 #[error("cannot exchange code for access and refresh tokens: {0}")]
41 ExchangeCodeError(String),
42
43 #[error(transparent)]
44 IoError(#[from] std::io::Error),
45 #[error(transparent)]
46 HttpError(#[from] http::Error),
47
48 #[error("cannot refresh access token using the refresh token")]
49 RefreshAccessTokenError(
50 Box<RequestTokenError<Error, StandardErrorResponse<BasicErrorResponseType>>>,
51 ),
52}