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}