pub use openidconnect;
pub use reqwest;
type OpenIdRequestCoreError = openidconnect::RequestTokenError<
reqwest::Error,
openidconnect::StandardErrorResponse<openidconnect::core::CoreErrorResponseType>,
>;
type OpenIdRequestDeviceError = openidconnect::RequestTokenError<
reqwest::Error,
openidconnect::StandardErrorResponse<openidconnect::DeviceCodeErrorResponseType>,
>;
type OpenIdUserInfoError = openidconnect::UserInfoError<reqwest::Error>;
type OpenIdConfigurationError = openidconnect::ConfigurationError;
pub type OpenIdDiscoveryError = openidconnect::DiscoveryError<reqwest::Error>;
#[derive(Debug)]
pub struct UrlParseError(pub String);
impl std::fmt::Display for UrlParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl core::error::Error for UrlParseError {}
#[derive(Debug)]
pub enum ConfigError {
OpenIdDiscovery(OpenIdDiscoveryError),
HttpClient(reqwest::Error),
}
impl core::error::Error for ConfigError {}
impl From<OpenIdDiscoveryError> for ConfigError {
fn from(value: OpenIdDiscoveryError) -> Self {
Self::OpenIdDiscovery(value)
}
}
impl From<reqwest::Error> for ConfigError {
fn from(value: reqwest::Error) -> Self {
Self::HttpClient(value)
}
}
impl std::fmt::Display for ConfigError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::OpenIdDiscovery(e) => e.fmt(f),
Self::HttpClient(e) => {
write!(f, "Unable to crate an HTTP client: {e:?}")
}
}
}
}
#[derive(Debug)]
pub enum AuthError<E> {
Handler(E),
OpenIdConfig(OpenIdConfigurationError),
OpenIdRequestCore(OpenIdRequestCoreError),
OpenIdRequestDevice(OpenIdRequestDeviceError),
}
impl<E> std::fmt::Display for AuthError<E>
where
E: std::fmt::Display,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Handler(e) => e.fmt(f),
Self::OpenIdConfig(e) => e.fmt(f),
Self::OpenIdRequestCore(e) => e.fmt(f),
Self::OpenIdRequestDevice(e) => e.fmt(f),
}
}
}
impl<E> core::error::Error for AuthError<E> where E: std::fmt::Debug + std::fmt::Display {}
impl<E> From<OpenIdConfigurationError> for AuthError<E> {
fn from(value: OpenIdConfigurationError) -> Self {
Self::OpenIdConfig(value)
}
}
impl<E> From<OpenIdRequestCoreError> for AuthError<E> {
fn from(value: OpenIdRequestCoreError) -> Self {
Self::OpenIdRequestCore(value)
}
}
impl<E> From<OpenIdRequestDeviceError> for AuthError<E> {
fn from(value: OpenIdRequestDeviceError) -> Self {
Self::OpenIdRequestDevice(value)
}
}
#[derive(Debug)]
pub enum UserInfoError {
Config(OpenIdConfigurationError),
UserInfo(OpenIdUserInfoError),
}
impl std::fmt::Display for UserInfoError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::UserInfo(e) => {
write!(f, "Failed requesting user info: {e:?}")
}
Self::Config(e) => {
write!(f, "No user info endpoint: {e:?}")
}
}
}
}
impl core::error::Error for UserInfoError {}
impl From<OpenIdConfigurationError> for UserInfoError {
fn from(value: OpenIdConfigurationError) -> Self {
Self::Config(value)
}
}
impl From<OpenIdUserInfoError> for UserInfoError {
fn from(value: OpenIdUserInfoError) -> Self {
Self::UserInfo(value)
}
}
#[derive(Debug)]
pub enum RefreshTokenError {
Config(OpenIdConfigurationError),
RequestCore(OpenIdRequestCoreError),
}
impl std::fmt::Display for RefreshTokenError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Config(e) => {
write!(f, "No token refresh endpoint: {e:?}")
}
Self::RequestCore(e) => e.fmt(f),
}
}
}
impl core::error::Error for RefreshTokenError {}
impl From<OpenIdConfigurationError> for RefreshTokenError {
fn from(value: OpenIdConfigurationError) -> Self {
Self::Config(value)
}
}
impl From<OpenIdRequestCoreError> for RefreshTokenError {
fn from(value: OpenIdRequestCoreError) -> Self {
Self::RequestCore(value)
}
}