#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Strictness {
Strict,
#[default]
Standard,
Lax,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DotPolicy {
#[default]
Preserve,
GmailOnly,
Always,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CasePolicy {
#[default]
Domain,
All,
Preserve,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DomainCheck {
#[default]
Syntax,
Psl,
Tld,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SubaddressPolicy {
#[default]
Preserve,
Strip,
}
#[derive(Debug, Clone)]
pub struct Config {
pub(crate) strictness: Strictness,
pub(crate) dot_policy: DotPolicy,
pub(crate) case_policy: CasePolicy,
pub(crate) domain_check: DomainCheck,
pub(crate) subaddress: SubaddressPolicy,
pub(crate) subaddress_separator: char,
pub(crate) check_confusables: bool,
pub(crate) allow_domain_literal: bool,
pub(crate) allow_display_name: bool,
pub(crate) require_tld_dot: bool,
}
impl Default for Config {
fn default() -> Self {
Self {
strictness: Strictness::Standard,
dot_policy: DotPolicy::Preserve,
case_policy: CasePolicy::Domain,
domain_check: DomainCheck::Syntax,
subaddress: SubaddressPolicy::Preserve,
subaddress_separator: '+',
check_confusables: false,
allow_domain_literal: false,
allow_display_name: false,
require_tld_dot: true,
}
}
}
impl Config {
pub fn builder() -> ConfigBuilder {
ConfigBuilder(Config::default())
}
}
pub struct ConfigBuilder(Config);
impl ConfigBuilder {
pub fn strictness(mut self, s: Strictness) -> Self {
self.0.strictness = s;
self
}
pub fn strip_subaddress(mut self) -> Self {
self.0.subaddress = SubaddressPolicy::Strip;
self
}
pub fn preserve_subaddress(mut self) -> Self {
self.0.subaddress = SubaddressPolicy::Preserve;
self
}
pub fn subaddress_separator(mut self, sep: char) -> Self {
self.0.subaddress_separator = sep;
self
}
pub fn dots_gmail_only(mut self) -> Self {
self.0.dot_policy = DotPolicy::GmailOnly;
self
}
pub fn dots_always_strip(mut self) -> Self {
self.0.dot_policy = DotPolicy::Always;
self
}
pub fn dots_preserve(mut self) -> Self {
self.0.dot_policy = DotPolicy::Preserve;
self
}
pub fn lowercase_all(mut self) -> Self {
self.0.case_policy = CasePolicy::All;
self
}
pub fn lowercase_domain(mut self) -> Self {
self.0.case_policy = CasePolicy::Domain;
self
}
pub fn preserve_case(mut self) -> Self {
self.0.case_policy = CasePolicy::Preserve;
self
}
pub fn domain_check_psl(mut self) -> Self {
self.0.domain_check = DomainCheck::Psl;
self
}
pub fn domain_check_tld(mut self) -> Self {
self.0.domain_check = DomainCheck::Tld;
self
}
pub fn check_confusables(mut self) -> Self {
self.0.check_confusables = true;
self
}
pub fn allow_domain_literal(mut self) -> Self {
self.0.allow_domain_literal = true;
self
}
pub fn allow_display_name(mut self) -> Self {
self.0.allow_display_name = true;
self
}
pub fn allow_single_label_domain(mut self) -> Self {
self.0.require_tld_dot = false;
self
}
pub fn domain_check_syntax(mut self) -> Self {
self.0.domain_check = DomainCheck::Syntax;
self
}
pub fn build(self) -> Config {
self.0
}
}