use std::fmt::{self, Display, Formatter};
use std::io;
pub type PrayResult<T> = Result<T, PrayError>;
#[derive(Debug)]
pub enum PrayError {
Parse { kind: &'static str, message: String },
Manifest(String),
Resolution(String),
Integrity(String),
Render(String),
Verify(String),
Network(String),
Usage(String),
Unsupported(String),
Io(io::Error),
}
impl PrayError {
pub fn exit_code(&self) -> i32 {
match self {
Self::Parse { .. } => 2,
Self::Manifest(_) => 1,
Self::Resolution(_) => 3,
Self::Integrity(_) => 4,
Self::Render(_) => 5,
Self::Verify(_) => 6,
Self::Network(_) => 7,
Self::Usage(_) => 2,
Self::Unsupported(_) => 8,
Self::Io(_) => 1,
}
}
}
impl Display for PrayError {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Parse { kind, message } => write!(f, "{} parse error: {}", kind, message),
Self::Manifest(message) => write!(f, "manifest error: {}", message),
Self::Resolution(message) => write!(f, "resolution error: {}", message),
Self::Integrity(message) => write!(f, "integrity error: {}", message),
Self::Render(message) => write!(f, "render error: {}", message),
Self::Verify(message) => write!(f, "verify error: {}", message),
Self::Network(message) => write!(f, "network error: {}", message),
Self::Usage(message) => write!(f, "usage error: {}", message),
Self::Unsupported(message) => write!(f, "unsupported feature: {}", message),
Self::Io(error) => write!(f, "I/O error: {error}"),
}
}
}
impl std::error::Error for PrayError {}
impl From<io::Error> for PrayError {
fn from(error: io::Error) -> Self {
Self::Io(error)
}
}
#[cfg(feature = "auth")]
impl From<rusqlite::Error> for PrayError {
fn from(error: rusqlite::Error) -> Self {
Self::Resolution(error.to_string())
}
}