1use thiserror::Error;
2
3#[derive(Error, Debug)]
5pub enum EmailError {
6 #[error("Template error: {message}")]
7 Template { message: String },
8
9 #[error("Provider error: {provider} - {message}")]
10 Provider { provider: String, message: String },
11
12 #[error("Configuration error: {message}")]
13 Configuration { message: String },
14
15 #[error("Validation error: {field} - {message}")]
16 Validation { field: String, message: String },
17
18 #[error("Queue error: {message}")]
19 Queue { message: String },
20
21 #[error("Tracking error: {message}")]
22 Tracking { message: String },
23
24 #[error("Network error: {message}")]
25 Network { message: String },
26
27 #[error("Serialization error: {message}")]
28 Serialization { message: String },
29
30 #[error("IO error: {message}")]
31 Io { message: String },
32}
33
34impl EmailError {
35 pub fn template(message: impl Into<String>) -> Self {
36 Self::Template {
37 message: message.into(),
38 }
39 }
40
41 pub fn provider(provider: impl Into<String>, message: impl Into<String>) -> Self {
42 Self::Provider {
43 provider: provider.into(),
44 message: message.into(),
45 }
46 }
47
48 pub fn configuration(message: impl Into<String>) -> Self {
49 Self::Configuration {
50 message: message.into(),
51 }
52 }
53
54 pub fn validation(field: impl Into<String>, message: impl Into<String>) -> Self {
55 Self::Validation {
56 field: field.into(),
57 message: message.into(),
58 }
59 }
60
61 pub fn queue(message: impl Into<String>) -> Self {
62 Self::Queue {
63 message: message.into(),
64 }
65 }
66
67 pub fn network(message: impl Into<String>) -> Self {
68 Self::Network {
69 message: message.into(),
70 }
71 }
72}
73
74impl From<lettre::error::Error> for EmailError {
78 fn from(err: lettre::error::Error) -> Self {
79 Self::provider("SMTP", err.to_string())
80 }
81}
82
83impl From<lettre::transport::smtp::Error> for EmailError {
84 fn from(err: lettre::transport::smtp::Error) -> Self {
85 Self::provider("SMTP", err.to_string())
86 }
87}
88
89impl From<reqwest::Error> for EmailError {
90 fn from(err: reqwest::Error) -> Self {
91 Self::network(err.to_string())
92 }
93}
94
95impl From<serde_json::Error> for EmailError {
96 fn from(err: serde_json::Error) -> Self {
97 Self::validation("json", err.to_string())
98 }
99}
100
101impl From<std::io::Error> for EmailError {
102 fn from(err: std::io::Error) -> Self {
103 Self::Io {
104 message: err.to_string(),
105 }
106 }
107}