use std::fmt::{Display, Formatter, Result};
use bincode::Error as BincodeError;
use serde_json::Error as JSONError;
use sqlx::Error as SQLError;
use std::error::Error as StandardError;
use std::io::Error as IOError;
use std::sync::PoisonError;
#[allow(missing_docs)]
#[derive(Debug, Eq, PartialEq)]
pub enum ErrorCode {
InvalidSource,
MissingSource,
InvalidID,
InvalidMetadata,
InvalidVector,
InvalidParameter,
InternalError,
RequestError,
NotFound,
ConcurrencyError,
FileError,
SerializationError,
SQLError,
}
#[derive(Debug)]
pub struct Error {
pub code: ErrorCode,
pub message: String,
}
impl Error {
pub fn new(code: ErrorCode, message: impl Into<String>) -> Self {
Self { code, message: message.into() }
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "{:?}: {}", self.code, self.message)
}
}
impl StandardError for Error {}
impl From<IOError> for Error {
fn from(err: IOError) -> Self {
let code = ErrorCode::FileError;
Error::new(code, err.to_string())
}
}
impl From<BincodeError> for Error {
fn from(err: BincodeError) -> Self {
let code = ErrorCode::SerializationError;
Error::new(code, err.to_string())
}
}
impl From<SQLError> for Error {
fn from(err: SQLError) -> Self {
let code = ErrorCode::SQLError;
Error::new(code, err.to_string())
}
}
impl From<JSONError> for Error {
fn from(err: JSONError) -> Self {
let code = ErrorCode::SerializationError;
Error::new(code, err.to_string())
}
}
impl<T> From<PoisonError<T>> for Error {
fn from(err: PoisonError<T>) -> Self {
let code = ErrorCode::ConcurrencyError;
Error::new(code, err.to_string())
}
}