Skip to main content

addr/
parser.rs

1//! Parser traits
2
3use crate::{dns, domain, email, Result};
4use psl_types::List;
5
6/// Parses a domain using the list
7pub trait DomainName {
8    /// This method tries to stick to restrictions usually imposed by domain registries
9    /// when registering domain names. If your input can potentially include additional
10    /// characters allowed in DNS labels, like underscores, use `parse_dns_name` instead.
11    fn parse_domain_name<'a>(&self, name: &'a str) -> Result<'a, domain::Name<'a>>;
12}
13
14impl<T> DomainName for T
15where
16    T: List,
17{
18    fn parse_domain_name<'a>(&self, name: &'a str) -> Result<'a, domain::Name<'a>> {
19        domain::Name::parse(self, name).map_err(|kind| kind.error_with(name))
20    }
21}
22
23/// Parses any arbitrary string that can be used as a key in a DNS database
24pub trait DnsName {
25    /// This method allows additional characters, like underscores, typically allowed
26    /// in DNS labels but are not usually allowed by domain registries. For that
27    /// use `parse_domain_name` instead.
28    fn parse_dns_name<'a>(&self, name: &'a str) -> Result<'a, dns::Name<'a>>;
29}
30
31impl<T> DnsName for T
32where
33    T: List,
34{
35    fn parse_dns_name<'a>(&self, name: &'a str) -> Result<'a, dns::Name<'a>> {
36        dns::Name::parse(self, name).map_err(|kind| kind.error_with(name))
37    }
38}
39
40/// Parses an email address using the list
41pub trait EmailAddress {
42    fn parse_email_address<'a>(&self, name: &'a str) -> Result<'a, email::Address<'a>>;
43}
44
45impl<T> EmailAddress for T
46where
47    T: List,
48{
49    /// By default email addresses with IP address host part are not supported.
50    /// If you need support for that, enable the `net` feature.
51    fn parse_email_address<'a>(&self, name: &'a str) -> Result<'a, email::Address<'a>> {
52        email::Address::parse(self, name).map_err(|kind| kind.error_with(name))
53    }
54}