elif_email/
error.rs

1use thiserror::Error;
2
3/// Email system errors
4#[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
74// Convert from common error types
75// Handlebars error handling removed - using Tera now
76
77impl 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}