use bcrypt::BcryptError;
use std::error::Error;
use std::fmt;
use crate::database::error::DatabaseError;
#[derive(Debug)]
pub enum CredentialsStoreError {
OperationError {
context: String,
source: Box<dyn Error>,
},
QueryError {
context: String,
source: Box<dyn Error>,
},
StorageError {
context: String,
source: Box<dyn Error>,
},
ConnectionError(Box<dyn Error>),
DuplicateError(String),
NotFoundError(String),
}
impl Error for CredentialsStoreError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
CredentialsStoreError::OperationError { source, .. } => Some(&**source),
CredentialsStoreError::QueryError { source, .. } => Some(&**source),
CredentialsStoreError::StorageError { source, .. } => Some(&**source),
CredentialsStoreError::ConnectionError(err) => Some(&**err),
CredentialsStoreError::DuplicateError(_) => None,
CredentialsStoreError::NotFoundError(_) => None,
}
}
}
impl fmt::Display for CredentialsStoreError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
CredentialsStoreError::OperationError { context, source } => {
write!(f, "failed to perform operation: {}: {}", context, source)
}
CredentialsStoreError::QueryError { context, source } => {
write!(f, "failed query: {}: {}", context, source)
}
CredentialsStoreError::StorageError { context, source } => write!(
f,
"the underlying storage returned an error: {}: {}",
context, source
),
CredentialsStoreError::ConnectionError(ref s) => {
write!(f, "failed to connect to underlying storage: {}", s)
}
CredentialsStoreError::DuplicateError(ref s) => {
write!(f, "credentials already exists: {}", s)
}
CredentialsStoreError::NotFoundError(ref s) => {
write!(f, "credentials not found: {}", s)
}
}
}
}
impl From<DatabaseError> for CredentialsStoreError {
fn from(err: DatabaseError) -> CredentialsStoreError {
match err {
DatabaseError::ConnectionError(_) => {
CredentialsStoreError::ConnectionError(Box::new(err))
}
_ => CredentialsStoreError::StorageError {
context: "The database returned an error".to_string(),
source: Box::new(err),
},
}
}
}
#[derive(Debug)]
pub enum UserCredentialsBuilderError {
MissingRequiredField(String),
BuildError(Box<dyn Error>),
EncryptionError(Box<dyn Error>),
}
impl Error for UserCredentialsBuilderError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
UserCredentialsBuilderError::MissingRequiredField(_) => None,
UserCredentialsBuilderError::BuildError(err) => Some(&**err),
UserCredentialsBuilderError::EncryptionError(err) => Some(&**err),
}
}
}
impl fmt::Display for UserCredentialsBuilderError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
UserCredentialsBuilderError::MissingRequiredField(ref s) => {
write!(f, "failed to build user credentials: {}", s)
}
UserCredentialsBuilderError::BuildError(ref s) => {
write!(f, "failed to build credentials: {}", s)
}
UserCredentialsBuilderError::EncryptionError(ref s) => {
write!(f, "failed encrypt password: {}", s)
}
}
}
}
impl From<BcryptError> for UserCredentialsBuilderError {
fn from(err: BcryptError) -> UserCredentialsBuilderError {
UserCredentialsBuilderError::EncryptionError(Box::new(err))
}
}
#[derive(Debug)]
pub enum UserCredentialsError {
VerificationError(Box<dyn Error>),
}
impl Error for UserCredentialsError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
UserCredentialsError::VerificationError(err) => Some(&**err),
}
}
}
impl fmt::Display for UserCredentialsError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
UserCredentialsError::VerificationError(ref s) => {
write!(f, "failed to build verify password: {}", s)
}
}
}
}
impl From<BcryptError> for UserCredentialsError {
fn from(err: BcryptError) -> UserCredentialsError {
UserCredentialsError::VerificationError(Box::new(err))
}
}