structured_email_address/
config.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub enum Strictness {
9 Strict,
12 #[default]
15 Standard,
16 Lax,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
22pub enum DotPolicy {
23 #[default]
25 Preserve,
26 GmailOnly,
28 Always,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
34pub enum CasePolicy {
35 #[default]
37 Domain,
38 All,
40 Preserve,
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
46pub enum DomainCheck {
47 #[default]
49 Syntax,
50 Psl,
52 Tld,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
58pub enum SubaddressPolicy {
59 #[default]
61 Preserve,
62 Strip,
64}
65
66#[derive(Debug, Clone)]
80pub struct Config {
81 pub(crate) strictness: Strictness,
82 pub(crate) dot_policy: DotPolicy,
83 pub(crate) case_policy: CasePolicy,
84 pub(crate) domain_check: DomainCheck,
85 pub(crate) subaddress: SubaddressPolicy,
86 pub(crate) subaddress_separator: char,
87 pub(crate) check_confusables: bool,
88 pub(crate) allow_domain_literal: bool,
89 pub(crate) allow_display_name: bool,
90 pub(crate) require_tld_dot: bool,
91}
92
93impl Default for Config {
94 fn default() -> Self {
95 Self {
96 strictness: Strictness::Standard,
97 dot_policy: DotPolicy::Preserve,
98 case_policy: CasePolicy::Domain,
99 domain_check: DomainCheck::Syntax,
100 subaddress: SubaddressPolicy::Preserve,
101 subaddress_separator: '+',
102 check_confusables: false,
103 allow_domain_literal: false,
104 allow_display_name: false,
105 require_tld_dot: true,
106 }
107 }
108}
109
110impl Config {
111 pub fn builder() -> ConfigBuilder {
113 ConfigBuilder(Config::default())
114 }
115}
116
117pub struct ConfigBuilder(Config);
119
120impl ConfigBuilder {
121 pub fn strictness(mut self, s: Strictness) -> Self {
123 self.0.strictness = s;
124 self
125 }
126
127 pub fn strip_subaddress(mut self) -> Self {
129 self.0.subaddress = SubaddressPolicy::Strip;
130 self
131 }
132
133 pub fn preserve_subaddress(mut self) -> Self {
135 self.0.subaddress = SubaddressPolicy::Preserve;
136 self
137 }
138
139 pub fn subaddress_separator(mut self, sep: char) -> Self {
141 self.0.subaddress_separator = sep;
142 self
143 }
144
145 pub fn dots_gmail_only(mut self) -> Self {
147 self.0.dot_policy = DotPolicy::GmailOnly;
148 self
149 }
150
151 pub fn dots_always_strip(mut self) -> Self {
153 self.0.dot_policy = DotPolicy::Always;
154 self
155 }
156
157 pub fn dots_preserve(mut self) -> Self {
159 self.0.dot_policy = DotPolicy::Preserve;
160 self
161 }
162
163 pub fn lowercase_all(mut self) -> Self {
165 self.0.case_policy = CasePolicy::All;
166 self
167 }
168
169 pub fn lowercase_domain(mut self) -> Self {
171 self.0.case_policy = CasePolicy::Domain;
172 self
173 }
174
175 pub fn preserve_case(mut self) -> Self {
177 self.0.case_policy = CasePolicy::Preserve;
178 self
179 }
180
181 pub fn domain_check_psl(mut self) -> Self {
183 self.0.domain_check = DomainCheck::Psl;
184 self
185 }
186
187 pub fn domain_check_tld(mut self) -> Self {
189 self.0.domain_check = DomainCheck::Tld;
190 self
191 }
192
193 pub fn check_confusables(mut self) -> Self {
195 self.0.check_confusables = true;
196 self
197 }
198
199 pub fn allow_domain_literal(mut self) -> Self {
201 self.0.allow_domain_literal = true;
202 self
203 }
204
205 pub fn allow_display_name(mut self) -> Self {
207 self.0.allow_display_name = true;
208 self
209 }
210
211 pub fn allow_single_label_domain(mut self) -> Self {
213 self.0.require_tld_dot = false;
214 self
215 }
216
217 pub fn build(self) -> Config {
219 self.0
220 }
221}