mod availability;
pub(crate) mod idn;
mod name;
mod tld;
pub use availability::Availability;
pub use name::{DomainName, SuffixSplit};
pub use tld::Tld;
use serde::de::{self, Deserializer};
use serde::ser::Serializer;
use serde::{Deserialize, Serialize};
impl Serialize for DomainName {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_ascii())
}
}
impl<'de> Deserialize<'de> for DomainName {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let raw = String::deserialize(deserializer)?;
DomainName::parse(&raw).map_err(de::Error::custom)
}
}
impl Serialize for Tld {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.ascii())
}
}
impl<'de> Deserialize<'de> for Tld {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let raw = String::deserialize(deserializer)?;
Tld::parse(&raw).map_err(de::Error::custom)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn domain_name_round_trips_through_json() {
let name = DomainName::parse("münchen.de").unwrap();
let json = serde_json::to_string(&name).unwrap();
assert_eq!(json, "\"xn--mnchen-3ya.de\"");
assert_eq!(serde_json::from_str::<DomainName>(&json).unwrap(), name);
}
#[test]
fn tld_round_trips_through_json() {
let tld = Tld::parse(".CO.UK").unwrap();
let json = serde_json::to_string(&tld).unwrap();
assert_eq!(json, "\"co.uk\"");
assert_eq!(serde_json::from_str::<Tld>(&json).unwrap(), tld);
}
#[test]
fn deserialising_junk_fails_rather_than_panicking() {
assert!(serde_json::from_str::<DomainName>("\"localhost\"").is_err());
assert!(serde_json::from_str::<Tld>("\"\"").is_err());
}
}