1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! Parser traits

#[cfg(any(feature = "net", feature = "serde-net"))]
use crate::email;
use crate::error::Error;
use crate::{dns, domain, Result};
use psl_types::List;

/// Parses a domain using the list
pub trait DomainName<'a> {
    fn parse_domain_name(&self, name: &'a str) -> Result<'a, domain::Name<'a>>;
}

impl<'a, T> DomainName<'a> for T
where
    T: List<'a>,
{
    fn parse_domain_name(&self, name: &'a str) -> Result<'a, domain::Name<'a>> {
        domain::Name::parse(self, name).map_err(|kind| Error::new(kind, name))
    }
}

/// Parses any arbitrary string that can be used as a key in a DNS database
pub trait DnsName<'a> {
    fn parse_dns_name(&self, name: &'a str) -> Result<'a, dns::Name<'a>>;
}

impl<'a, T> DnsName<'a> for T
where
    T: List<'a>,
{
    fn parse_dns_name(&self, name: &'a str) -> Result<'a, dns::Name<'a>> {
        dns::Name::parse(self, name).map_err(|kind| Error::new(kind, name))
    }
}

/// Parses an email address using the list
#[cfg(any(feature = "net", feature = "serde-net"))]
pub trait EmailAddress<'a> {
    fn parse_email_address(&self, name: &'a str) -> Result<'a, email::Address<'a>>;
}

#[cfg(any(feature = "net", feature = "serde-net"))]
impl<'a, T> EmailAddress<'a> for T
where
    T: List<'a>,
{
    fn parse_email_address(&self, name: &'a str) -> Result<'a, email::Address<'a>> {
        email::Address::parse(self, name).map_err(|kind| Error::new(kind, name))
    }
}