use std::error::Error as StdError;
use std::fmt::Display;
use reqwest::{StatusCode, Url};
#[derive(Debug, thiserror::Error)]
pub enum CredentialError {
#[error("{0}")]
Invalid(String),
#[error("{url} returned {status}: {body}")]
Rejected {
url: Url,
status: StatusCode,
body: String,
},
#[error(transparent)]
Url(#[from] url::ParseError),
#[error(transparent)]
Http(#[from] reqwest::Error),
#[error(transparent)]
Json(#[from] serde_json::Error),
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
External(Box<dyn StdError + Send + Sync>),
}
pub type CredentialResult<T> = Result<T, CredentialError>;
impl CredentialError {
pub fn invalid(message: impl Display) -> Self {
Self::Invalid(message.to_string())
}
pub fn external(error: impl Into<Box<dyn StdError + Send + Sync>>) -> Self {
Self::External(error.into())
}
}
impl From<reqwest_middleware::Error> for CredentialError {
fn from(error: reqwest_middleware::Error) -> Self {
match error {
reqwest_middleware::Error::Reqwest(error) => Self::Http(error),
reqwest_middleware::Error::Middleware(error) => Self::External(error.into()),
}
}
}