use oxilangtag::LanguageTag;
use serde::{Deserialize, Deserializer};
pub fn validate_text(txt: &str) -> bool {
txt.chars().all(|c| {
matches!(c,
'\t' | '\n' | '\r' | ' '..='\u{7F}' | '\u{E000}'..= '\u{FFFD}' | '\u{10000}'..='\u{10FFFF}' )
})
}
pub fn deserialize_normalized_text<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let buf = String::deserialize(deserializer)?;
let valid = validate_text(&buf);
match valid {
true => Ok(buf),
false => Err(serde::de::Error::custom(
"Non valid character (control ones) found.",
)),
}
}
pub fn deserialize_normalized_lang_tag<'de, D>(
deserializer: D,
) -> Result<LanguageTag<String>, D::Error>
where
D: Deserializer<'de>,
{
let buf = String::deserialize(deserializer)?;
LanguageTag::parse_and_normalize(&buf).map_err(serde::de::Error::custom)
}