#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Version error: {0}")]
VersionMismatch(String),
#[error("Invalid request encoding: {0}")]
InvalidEncoding(String),
#[error("Payload too large: {0}")]
PayloadTooLarge(String),
#[error("Not found: {0}")]
NotFound(String),
#[error("Unsupported operation")]
Unsupported,
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("VM error: {0}")]
Vm(String),
#[error("Database error: {0}")]
Database(String),
#[error("Data driver error: {0}")]
DataDriver(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Prover error: {0}")]
Prover(String),
#[error("Verification error: {0}")]
Verification(String),
#[error("{0}")]
Internal(String),
}
impl Error {
pub fn http_code(&self) -> u16 {
match self {
Error::InvalidInput(_)
| Error::VersionMismatch(_)
| Error::InvalidEncoding(_) => 400,
Error::PayloadTooLarge(_) => 413,
Error::NotFound(_) => 404,
Error::Unsupported => 501,
Error::Serialization(_)
| Error::Vm(_)
| Error::Database(_)
| Error::DataDriver(_)
| Error::Io(_)
| Error::Prover(_)
| Error::Verification(_)
| Error::Internal(_) => 500,
}
}
pub fn invalid_input<T: AsRef<str>>(msg: T) -> Self {
Error::InvalidInput(msg.as_ref().to_string())
}
pub fn not_found<T: AsRef<str>>(msg: T) -> Self {
Error::NotFound(msg.as_ref().to_string())
}
pub fn vm<T: AsRef<str>>(msg: T) -> Self {
Error::Vm(msg.as_ref().to_string())
}
pub fn database<T: AsRef<str>>(msg: T) -> Self {
Error::Database(msg.as_ref().to_string())
}
pub fn data_driver<T: AsRef<str>>(msg: T) -> Self {
Error::DataDriver(msg.as_ref().to_string())
}
pub fn prover<T: AsRef<str>>(msg: T) -> Self {
Error::Prover(msg.as_ref().to_string())
}
pub fn verification<T: AsRef<str>>(msg: T) -> Self {
Error::Verification(msg.as_ref().to_string())
}
pub fn internal<T: AsRef<str>>(msg: T) -> Self {
Error::Internal(msg.as_ref().to_string())
}
pub fn payload_too_large<T: AsRef<str>>(msg: T) -> Self {
Error::PayloadTooLarge(msg.as_ref().to_string())
}
}
impl From<dusk_data_driver::Error> for Error {
fn from(e: dusk_data_driver::Error) -> Self {
Self::DataDriver(e.to_string())
}
}
impl From<semver::Error> for Error {
fn from(e: semver::Error) -> Self {
Self::VersionMismatch(e.to_string())
}
}