email_clients/clients/mod.rs
1#[cfg(any(
2 feature = "mailersend",
3 feature = "terminal",
4 feature = "smtp",
5 feature = "memory",
6 feature = "document-features"
7))]
8use crate::configuration::EmailConfiguration;
9#[cfg(any(
10 feature = "mailersend",
11 feature = "terminal",
12 feature = "smtp",
13 feature = "memory",
14 feature = "document-features"
15))]
16use crate::traits::EmailTrait;
17
18#[cfg_attr(docsrs, doc(cfg(feature = "smtp")))]
19#[cfg(feature = "smtp")]
20pub mod smtp;
21
22#[cfg_attr(docsrs, doc(cfg(feature = "memory")))]
23#[cfg(feature = "memory")]
24pub mod memory;
25
26#[cfg_attr(docsrs, doc(cfg(feature = "terminal")))]
27#[cfg(feature = "terminal")]
28pub mod terminal;
29
30#[cfg_attr(docsrs, doc(cfg(feature = "mailersend")))]
31#[cfg(feature = "mailersend")]
32pub mod mailersend;
33
34#[cfg(any(
35 feature = "mailersend",
36 feature = "terminal",
37 feature = "smtp",
38 feature = "memory",
39 feature = "document-features"
40))]
41///`EmailClient` Enum representing different types of email clients.
42///Currently supported email clients: SMTP, Terminal, Memory.
43///
44/// # Examples
45///
46/// To integrate SMTP email client:
47///
48///```rust
49/// # #[cfg(feature = "smtp")]{
50/// use email_clients::clients::EmailClient;
51/// use email_clients::clients::smtp::{SmtpClient, SmtpConfig};
52/// let config = SmtpConfig::default();
53/// let smtp_email_client = EmailClient::Smtp(SmtpClient::new(config));
54/// # }
55///```
56///
57///To integrate Terminal email client:
58///
59///```rust
60/// # #[cfg(feature = "terminal")]{
61/// use email_clients::clients::EmailClient;
62/// use email_clients::configuration::EmailConfiguration::Terminal;
63/// use email_clients::clients::terminal::{TerminalClient, TerminalConfig};
64/// let config = TerminalConfig::default() ;
65/// let terminal_email_client = EmailClient::Terminal(TerminalClient::new(config));
66/// # }
67///```
68///
69///To integrate Memory email client:
70///
71///```rust
72/// # #[cfg(feature = "memory")]{
73/// use email_clients::clients::EmailClient;
74/// use email_clients::configuration::EmailConfiguration::Memory;
75/// use email_clients::clients::memory::{MemoryClient, MemoryConfig};
76///let config = MemoryConfig::default();
77///
78///let memory_email_client = EmailClient::Memory(MemoryClient::new(config));
79/// # }
80///```
81///
82/// To integrate mailersend client:
83///
84///```rust
85/// # #[cfg(feature = "mailersend")]{
86/// use email_clients::clients::EmailClient;
87/// use email_clients::clients::mailersend::{MailerSendClient, MailerSendConfig};
88///
89/// let config = MailerSendConfig::default().api_token("API_TOKEN");
90/// let mailersend_client = EmailClient::MailerSend(MailerSendClient::new(config));
91/// # }
92#[derive(Clone, Debug)]
93pub enum EmailClient {
94 #[cfg(feature = "smtp")]
95 Smtp(smtp::SmtpClient),
96 #[cfg(feature = "terminal")]
97 Terminal(terminal::TerminalClient),
98 #[cfg(feature = "memory")]
99 Memory(memory::MemoryClient),
100 #[cfg(feature = "mailersend")]
101 MailerSend(mailersend::MailerSendClient),
102}
103
104#[cfg(feature = "terminal")]
105impl Default for EmailClient {
106 /// Default constructor for EmailClient.
107 ///
108 /// This method will create a new EmailClient configured with default `TerminalClient`.
109 /// This is useful when you want to quickly get a working EmailClient without specifying any configuration.
110 ///
111 /// # Examples
112 ///
113 /// Basic usage:
114 ///
115 /// ```rust
116 /// # use email_clients::clients::EmailClient;
117 /// let client = EmailClient::default();
118 /// assert_eq!(client.unwrap().get_sender().to_string(), "");
119 /// ```
120 fn default() -> Self {
121 EmailClient::Terminal(Default::default())
122 }
123}
124
125#[cfg(any(
126 feature = "mailersend",
127 feature = "terminal",
128 feature = "smtp",
129 feature = "memory",
130 feature = "document-features"
131))]
132pub fn get_email_client(configuration: EmailConfiguration) -> EmailClient {
133 match configuration {
134 #[cfg(feature = "terminal")]
135 EmailConfiguration::Terminal(c) => EmailClient::Terminal(terminal::TerminalClient::new(c)),
136 #[cfg(feature = "smtp")]
137 EmailConfiguration::SMTP(smtp_config) => {
138 EmailClient::Smtp(smtp::SmtpClient::new(smtp_config))
139 }
140 #[cfg(feature = "memory")]
141 EmailConfiguration::Memory(c) => EmailClient::Memory(memory::MemoryClient::new(c)),
142 #[cfg(feature = "mailersend")]
143 EmailConfiguration::Mailersend(c) => {
144 EmailClient::MailerSend(mailersend::MailerSendClient::new(c))
145 }
146 }
147}
148
149#[cfg(any(
150 feature = "mailersend",
151 feature = "terminal",
152 feature = "smtp",
153 feature = "memory",
154 feature = "document-features"
155))]
156impl EmailClient {
157 /// Unwrap the `EmailClient` enum variant and convert it into a `Box<dyn EmailTrait + Send>`.
158 ///
159 /// This method allows us to obtain a Boxed trait object which implements
160 /// `EmailTrait` and `Send` from an instance of `EmailClient` regardless of its variant.
161 ///
162 /// # Examples
163 ///
164 /// Basic usage:
165 ///
166 /// ```rust
167 /// # #[cfg(feature = "smtp")]{
168 /// # use email_clients::clients::EmailClient;
169 /// # use email_clients::clients::smtp::{SmtpClient, SmtpConfig};
170 /// use email_clients::email::EmailObject;
171 /// # use email_clients::Result;
172 ///
173 /// # async fn run() -> Result<()> {
174 /// let config = SmtpConfig::default();
175 /// let smtp_email_client = EmailClient::Smtp(SmtpClient::new(config));
176 ///
177 /// // Unwrapping converts the specific variant into a Boxed trait object.
178 /// let unwrapped_client = smtp_email_client.unwrap();
179 ///
180 /// // Now we can use unwrapped_client directly to use methods of EmailTrait.
181 /// unwrapped_client.send_emails(EmailObject::default()).await?;
182 /// # Ok(())
183 /// # }
184 /// # }
185 /// # fn main() {}
186 /// ```
187 pub fn unwrap(self) -> Box<dyn EmailTrait + Send> {
188 match self {
189 #[cfg(feature = "smtp")]
190 EmailClient::Smtp(c) => Box::new(c) as Box<dyn EmailTrait + Send>,
191 #[cfg(feature = "terminal")]
192 EmailClient::Terminal(c) => Box::new(c) as Box<dyn EmailTrait + Send>,
193 #[cfg(feature = "memory")]
194 EmailClient::Memory(c) => Box::new(c) as Box<dyn EmailTrait + Send>,
195 #[cfg(feature = "mailersend")]
196 EmailClient::MailerSend(c) => Box::new(c) as Box<dyn EmailTrait + Send>,
197 }
198 }
199}