rust-errkit 0.1.0

Idiomatic Rust error handling kit
Documentation
use serde::Serialize;

#[derive(Debug, Clone, Serialize)]
pub enum ErrorDomain {
    Core,
    Network,
    Database,
    IO,
    Auth,
    External,
}

#[derive(Debug, Clone, Serialize)]
pub enum ErrorReason {
    Timeout,
    NotFound,
    Unauthorized,
    Forbidden,
    InvalidInput,
    ConnectionFailed,
    Unexpected,
}

#[derive(Debug, Clone, Serialize)]
pub struct ErrorKind {
    pub domain: ErrorDomain,
    pub reason: ErrorReason,
}

impl ErrorKind {
    pub fn message(&self) -> &'static str {
        self.reason.message()
    }

    pub fn new(domain: ErrorDomain, reason: ErrorReason) -> Self {
        Self { domain, reason }
    }

    pub fn core(reason: ErrorReason) -> Self {
        Self::new(ErrorDomain::Core, reason)
    }

    pub fn network(reason: ErrorReason) -> Self {
        Self::new(ErrorDomain::Network, reason)
    }

    pub fn auth(reason: ErrorReason) -> Self {
        Self::new(ErrorDomain::Auth, reason)
    }

    pub fn db(reason: ErrorReason) -> Self {
        Self::new(ErrorDomain::Database, reason)
    }

    pub fn io(reason: ErrorReason) -> Self {
        Self::new(ErrorDomain::IO, reason)
    }

    pub fn unknown() -> Self {
        Self::new(ErrorDomain::External, ErrorReason::Unexpected)
    }
}

impl ErrorReason {
    pub fn message(&self) -> &'static str {
        match self {
            Self::Timeout => "Request timeout.",
            Self::NotFound => "Data not found.",
            Self::Unauthorized => "Unauthorized access.",
            Self::Forbidden => "Access denied.",
            Self::InvalidInput => "Invalid input.",
            Self::ConnectionFailed => "Connection failed.",
            Self::Unexpected => "Unexpected error occurred.",
        }
    }
}