Skip to main content

email_clients/clients/
terminal.rs

1use crate::configuration::EmailConfiguration;
2use crate::email::{EmailAddress, EmailObject};
3use crate::traits::EmailTrait;
4use async_trait::async_trait;
5
6#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, Default, PartialOrd, PartialEq)]
7pub struct TerminalConfig {
8    pub sender: EmailAddress,
9}
10
11impl From<String> for TerminalConfig {
12    /// Converts a `String` into a `MemoryConfig`.
13    ///
14    /// # Parameters
15    /// - `value`: A `String` value which will be used to initialize a `MemoryConfig` instance.
16    ///
17    /// # Returns
18    /// A new instance of `MemoryConfig` with the `sender` property set to the provided `String`.
19    ///
20    /// # Examples
21    /// ```rust
22    /// use email_clients::clients::terminal::TerminalConfig;
23    /// let value = String::from("sender@example.com");
24    /// let config = TerminalConfig::from(value);
25    /// assert_eq!(config.sender.to_string(), "sender@example.com");
26    /// ```
27    fn from(value: String) -> Self {
28        Self {
29            sender: value.as_str().into(),
30        }
31    }
32}
33
34#[derive(Clone, Debug, Default, PartialOrd, PartialEq)]
35pub struct TerminalClient {
36    sender: EmailAddress,
37}
38
39impl From<TerminalConfig> for EmailConfiguration {
40    /// This module manages the Terminal Configuration for an Email Client. It can be used to generate a client from a configuration.
41    ///
42    /// # Examples
43    ///
44    /// Basic usage:
45    ///
46    /// ```
47    /// # use email_clients::email::EmailObject;
48    /// # use email_clients::clients::terminal::TerminalConfig;
49    /// # use email_clients::configuration::EmailConfiguration;
50    /// #
51    /// let config: TerminalConfig = String::from("me@domain.com").into();
52    /// let email_config: EmailConfiguration = config.into();
53    ///```
54    ///
55    /// Converting a Terminal Configuration into an Email Configuration directly:
56    ///
57    /// ```
58    /// # use email_clients::clients::terminal::TerminalConfig;
59    /// # use email_clients::configuration::EmailConfiguration;
60    /// #
61    /// let config: TerminalConfig = String::from("me@domain.com").into();
62    /// let new_config: EmailConfiguration = config.into();
63    /// ```
64    ///
65    fn from(value: TerminalConfig) -> Self {
66        EmailConfiguration::Terminal(value)
67    }
68}
69
70impl TerminalClient {
71    pub fn new(config: TerminalConfig) -> Self {
72        Self {
73            sender: config.sender,
74        }
75    }
76}
77
78#[async_trait]
79impl EmailTrait for TerminalClient {
80    fn get_sender(&self) -> EmailAddress {
81        self.sender.clone()
82    }
83
84    async fn send_emails(&self, email: EmailObject) -> crate::Result<()> {
85        println!("From: {}", self.sender);
86        for e in email.to {
87            println!("To: {} <{}>", e.name, e.email);
88        }
89        println!("Subject: {}\n\n", email.subject);
90        println!("{}", email.plain);
91        println!("----------");
92        println!("{}", email.html);
93        Ok(())
94    }
95}