email/tls/
mod.rs

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