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}