Skip to main content

email/tls/
mod.rs

1use std::{fmt, path::PathBuf};
2
3#[cfg(feature = "derive")]
4pub mod derive;
5
6#[derive(Clone, Debug, Eq, PartialEq)]
7#[cfg_attr(
8    feature = "derive",
9    derive(serde::Serialize, serde::Deserialize),
10    serde(rename_all = "kebab-case"),
11    serde(tag = "type")
12)]
13pub enum Encryption {
14    Tls(Tls),
15    #[cfg_attr(feature = "derive", serde(alias = "starttls"))]
16    StartTls(Tls),
17    None,
18}
19
20impl Default for Encryption {
21    fn default() -> Self {
22        Self::Tls(Default::default())
23    }
24}
25
26impl fmt::Display for Encryption {
27    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28        match self {
29            Self::Tls(_) => write!(f, "SSL/TLS"),
30            Self::StartTls(_) => write!(f, "StartTLS"),
31            Self::None => write!(f, "None"),
32        }
33    }
34}
35
36#[derive(Clone, Debug, Default, Eq, PartialEq)]
37#[cfg_attr(
38    feature = "derive",
39    derive(serde::Serialize, serde::Deserialize),
40    serde(rename_all = "kebab-case")
41)]
42pub struct Tls {
43    pub provider: Option<TlsProvider>,
44    pub cert: Option<PathBuf>,
45}
46
47#[derive(Clone, Debug, Eq, PartialEq)]
48#[cfg_attr(
49    feature = "derive",
50    derive(serde::Serialize, serde::Deserialize),
51    serde(rename_all = "kebab-case"),
52    serde(tag = "type"),
53    serde(from = "derive::TlsProvider")
54)]
55pub enum TlsProvider {
56    #[cfg(feature = "rustls")]
57    Rustls(Rustls),
58    // #[cfg(feature = "native-tls")]
59    // NativeTls(NativeTls),
60    None,
61}
62
63#[cfg(feature = "rustls")]
64impl Default for TlsProvider {
65    fn default() -> Self {
66        TlsProvider::Rustls(Default::default())
67    }
68}
69
70#[cfg(not(feature = "rustls"))]
71impl Default for TlsProvider {
72    fn default() -> Self {
73        Tls::None
74    }
75}
76
77impl fmt::Display for TlsProvider {
78    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79        match self {
80            #[cfg(feature = "rustls")]
81            Self::Rustls(_) => write!(f, "Rust native (rustls)"),
82            // #[cfg(feature = "native-tls")]
83            // Self::NativeTls(_) => write!(f, "OS native (native-tls)"),
84            Self::None => write!(f, "None"),
85        }
86    }
87}
88
89#[derive(Clone, Debug, Default, Eq, PartialEq)]
90#[cfg(feature = "rustls")]
91#[cfg_attr(
92    feature = "derive",
93    derive(serde::Serialize, serde::Deserialize),
94    serde(rename_all = "kebab-case")
95)]
96pub struct Rustls {
97    // TODO: define rustls specific options?
98}
99
100// #[derive(Clone, Debug, Default, Eq, PartialEq)]
101// #[cfg(feature = "native-tls")]
102// #[cfg_attr(
103//     feature = "derive",
104//     derive(serde::Serialize, serde::Deserialize),
105//     serde(rename_all = "kebab-case")
106// )]
107// pub struct NativeTls {
108//     // TODO: define native-tls specific options?
109// }