Skip to main content

rust_errkit/
kind.rs

1use serde::Serialize;
2
3#[derive(Debug, Clone, Serialize)]
4pub enum ErrorDomain {
5    Core,
6    Network,
7    Database,
8    IO,
9    Auth,
10    External,
11}
12
13#[derive(Debug, Clone, Serialize)]
14pub enum ErrorReason {
15    Timeout,
16    NotFound,
17    Unauthorized,
18    Forbidden,
19    InvalidInput,
20    ConnectionFailed,
21    Unexpected,
22}
23
24#[derive(Debug, Clone, Serialize)]
25pub struct ErrorKind {
26    pub domain: ErrorDomain,
27    pub reason: ErrorReason,
28}
29
30impl ErrorKind {
31    pub fn message(&self) -> &'static str {
32        self.reason.message()
33    }
34
35    pub fn new(domain: ErrorDomain, reason: ErrorReason) -> Self {
36        Self { domain, reason }
37    }
38
39    pub fn core(reason: ErrorReason) -> Self {
40        Self::new(ErrorDomain::Core, reason)
41    }
42
43    pub fn network(reason: ErrorReason) -> Self {
44        Self::new(ErrorDomain::Network, reason)
45    }
46
47    pub fn auth(reason: ErrorReason) -> Self {
48        Self::new(ErrorDomain::Auth, reason)
49    }
50
51    pub fn db(reason: ErrorReason) -> Self {
52        Self::new(ErrorDomain::Database, reason)
53    }
54
55    pub fn io(reason: ErrorReason) -> Self {
56        Self::new(ErrorDomain::IO, reason)
57    }
58
59    pub fn unknown() -> Self {
60        Self::new(ErrorDomain::External, ErrorReason::Unexpected)
61    }
62}
63
64impl ErrorReason {
65    pub fn message(&self) -> &'static str {
66        match self {
67            Self::Timeout => "Request timeout.",
68            Self::NotFound => "Data not found.",
69            Self::Unauthorized => "Unauthorized access.",
70            Self::Forbidden => "Access denied.",
71            Self::InvalidInput => "Invalid input.",
72            Self::ConnectionFailed => "Connection failed.",
73            Self::Unexpected => "Unexpected error occurred.",
74        }
75    }
76}