use std::error::Error as StdError;
use std::fmt::{Display, Formatter, Result as FmtResult};
use serde::Deserialize;
pub type OidcReturn<T> = Result<T, OpenIdError>;
#[derive(Debug, Deserialize)]
pub struct StandardBodyError {
pub error: String,
pub error_description: Option<String>,
pub error_uri: Option<String>,
}
#[derive(Debug)]
pub struct Error {
pub message: String,
}
#[derive(Debug)]
pub struct ClientError {
pub message: String,
}
#[derive(Debug)]
pub enum OpenIdError {
Error(Error),
ClientError(ClientError),
OPError(StandardBodyError),
}
impl Display for OpenIdError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
OpenIdError::Error(err) => write!(f, "Error: {}", err.message),
OpenIdError::ClientError(err) => write!(f, "Client error: {}", err.message),
OpenIdError::OPError(err) => write!(
f,
"OpenId server error: {}, description {:?}",
err.error, err.error_description
),
}
}
}
impl StdError for OpenIdError {}
impl OpenIdError {
pub(crate) fn new_error(message: impl Into<String>) -> OpenIdError {
OpenIdError::Error(Error {
message: message.into(),
})
}
pub(crate) fn new_client_error(message: impl Into<String>) -> OpenIdError {
OpenIdError::ClientError(ClientError {
message: message.into(),
})
}
pub(crate) fn new_op_error(
error: impl Into<String>,
error_description: Option<String>,
error_uri: Option<String>,
) -> OpenIdError {
OpenIdError::OPError(StandardBodyError {
error: error.into(),
error_description,
error_uri,
})
}
}