use crate::part1::v3_1::primitives::Identifier;
use oxilangtag::LanguageTag;
use serde::{Deserialize, Deserializer};
pub fn validate_text(txt: &str) -> bool {
txt.chars().all(|c| {
matches!(c,
'\t' | '\n' | '\r' | ' '..='\u{D7FF}' | '\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(format!(
"(Normalized Text) Non valid character (control ones) found, found '{}'",
&buf
))),
}
}
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)
}
pub fn deserialize_empty_identifier_as_none<'de, D>(
deserializer: D,
) -> Result<Option<Identifier>, D::Error>
where
D: Deserializer<'de>,
{
let o: Option<String> = Option::deserialize(deserializer)?;
match o {
None => Ok(None),
Some(s) if s.trim().is_empty() => Ok(None),
Some(s) => Identifier::try_from(s)
.map(Some)
.map_err(serde::de::Error::custom),
}
}