1use serde::Deserialize;
2
3#[derive(Clone, Debug, Deserialize)]
4pub struct Mail {
5 #[serde(default)]
6 pub mailer: Mailer,
7 #[serde(default = "default_host")]
8 pub host: String,
9 #[serde(default = "default_port")]
10 pub port: u16,
11 #[serde(default = "default_username")]
12 pub username: String,
13 #[serde(default = "default_password")]
14 pub password: String,
15 #[serde(default = "default_timeout")]
16 pub timeout: u64,
17 #[serde(default)]
18 pub pool: PoolConfig,
19}
20
21#[derive(Clone, Debug, Default, Deserialize)]
22pub enum Mailer {
23 #[serde(rename = "smtp")]
24 Smtp,
25 #[default]
26 #[serde(rename = "stub")]
27 Stub,
28}
29
30impl std::fmt::Display for Mailer {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 match self {
33 Self::Smtp => "smtp".fmt(f),
34 Self::Stub => "stub".fmt(f),
35 }
36 }
37}
38
39fn default_timeout() -> u64 {
40 3000 }
42
43fn default_host() -> String {
44 "smtp.example.com".to_string()
45}
46
47fn default_port() -> u16 {
48 465
49}
50
51fn default_username() -> String {
52 "hello@example.com".to_string()
53}
54
55fn default_password() -> String {
56 "password".to_string()
57}
58
59#[derive(Clone, Debug, Deserialize)]
60pub struct PoolConfig {
61 #[serde(default = "default_min_idle")]
62 pub min_idle: u32,
63 #[serde(default = "default_max_size")]
64 pub max_size: u32,
65 #[serde(default = "default_idle_timeout")]
66 pub idle_timeout: u64,
67}
68
69impl Default for PoolConfig {
70 fn default() -> Self {
71 PoolConfig {
72 min_idle: default_min_idle(),
73 max_size: default_max_size(),
74 idle_timeout: default_idle_timeout(),
75 }
76 }
77}
78
79fn default_min_idle() -> u32 {
80 0
81}
82
83fn default_max_size() -> u32 {
84 10
85}
86
87fn default_idle_timeout() -> u64 {
88 60 * 1000
89}