use std::fmt::{Display, Formatter, Result, Debug};
use std::error::Error;
use sqlx::error::{DatabaseError, ErrorKind};
use sqlx::Error as SqlxError;
#[derive(Debug)]
pub struct KitxError {
message: String,
}
#[derive(Debug)]
pub enum QueryError {
DBPoolNotInitialized,
NoPrimaryKeyDefined,
PageNumberInvalid,
LimitInvalid,
ColumnsListEmpty,
NoEntitiesProvided,
ValueInvalid(String),
DuplicateWhereClause,
Other(String),
}
#[derive(Debug)]
pub enum RelationError {
ValueEmpty(usize),
ValueMismatch(usize, String, String),
}
impl QueryError {
pub fn message(&self) -> String {
match self {
Self::DBPoolNotInitialized => "Database pool not initialized".to_string(),
Self::NoPrimaryKeyDefined => "No primary key defined".to_string(),
Self::PageNumberInvalid => "Page number and page size must be greater than 0".to_string(),
Self::LimitInvalid => "Limit must be greater than 0".to_string(),
Self::ValueInvalid(column_name) => format!("Field {} has an invalid value", column_name),
Self::ColumnsListEmpty => "No valid fields provided".to_string(),
Self::NoEntitiesProvided => "No entities provided".to_string(),
Self::DuplicateWhereClause => "Duplicate WHERE clause".to_string(),
Self::Other(msg) => msg.to_owned(),
}
}
}
impl RelationError {
pub fn message(&self) -> String {
match self {
Self::ValueEmpty(size) => format!("Expected non-empty values, got {}", size),
Self::ValueMismatch(index, expected, actual) =>
format!("Value mismatch: index {}, expected {}, got {}", index, expected, actual),
}
}
}
impl Display for KitxError {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(f, "{:?}", self.message)
}
}
impl Error for KitxError {}
impl KitxError {
pub fn new(message: String) -> Self {
KitxError { message }
}
}
impl From<QueryError> for KitxError {
fn from(err: QueryError) -> Self {
KitxError { message: err.message() }
}
}
impl From<QueryError> for SqlxError {
fn from(err: QueryError) -> Self {
SqlxError::Database(Box::new(KitxError { message: err.message() }))
}
}
impl From<RelationError> for SqlxError {
fn from(err: RelationError) -> Self {
SqlxError::Database(Box::new(KitxError { message: err.message() }))
}
}
impl DatabaseError for KitxError {
fn as_error(&self) -> &(dyn Error + Send + Sync + 'static) {
self
}
fn message(&self) -> &str {
&self.message
}
fn as_error_mut(&mut self) -> &mut (dyn Error + Send + Sync + 'static) {
self
}
fn into_error(self: Box<Self>) -> Box<dyn Error + Send + Sync + 'static> {
self
}
fn kind(&self) -> ErrorKind {
ErrorKind::Other
}
}