Skip to main content

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}