use std::error::Error;
use std::fmt;
use crate::error::InternalError;
#[derive(Debug)]
pub enum RefreshTokenError {
OperationError {
context: String,
source: Box<dyn Error>,
},
QueryError {
context: String,
source: Box<dyn Error>,
},
StorageError {
context: String,
source: Option<Box<dyn Error>>,
},
ConnectionError(Box<dyn Error>),
NotFoundError(String),
InternalError(InternalError),
}
impl Error for RefreshTokenError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
RefreshTokenError::OperationError { source, .. } => Some(&**source),
RefreshTokenError::QueryError { source, .. } => Some(&**source),
RefreshTokenError::StorageError {
source: Some(source),
..
} => Some(&**source),
RefreshTokenError::StorageError { source: None, .. } => None,
RefreshTokenError::ConnectionError(err) => Some(&**err),
RefreshTokenError::NotFoundError(_) => None,
RefreshTokenError::InternalError(err) => Some(err),
}
}
}
impl fmt::Display for RefreshTokenError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
RefreshTokenError::OperationError { context, source } => {
write!(f, "failed to perform operation: {}: {}", context, source)
}
RefreshTokenError::QueryError { context, source } => {
write!(f, "failed query: {}: {}", context, source)
}
RefreshTokenError::StorageError {
context,
source: Some(source),
} => write!(
f,
"the underlying storage returned an error: {}: {}",
context, source
),
RefreshTokenError::StorageError {
context,
source: None,
} => write!(f, "the underlying storage returned an error: {}", context),
RefreshTokenError::ConnectionError(ref s) => {
write!(f, "failed to connect to underlying storage: {}", s)
}
RefreshTokenError::NotFoundError(ref s) => write!(f, "refresh token not found: {}", s),
RefreshTokenError::InternalError(err) => f.write_str(&err.to_string()),
}
}
}
#[cfg(feature = "diesel")]
impl From<diesel::r2d2::PoolError> for RefreshTokenError {
fn from(err: diesel::r2d2::PoolError) -> RefreshTokenError {
RefreshTokenError::ConnectionError(Box::new(err))
}
}
impl From<InternalError> for RefreshTokenError {
fn from(err: InternalError) -> Self {
Self::InternalError(err)
}
}