use icu_locale::Locale;
use serde::{de::Error, Deserialize, Deserializer, Serializer};
use std::str::FromStr;
#[allow(clippy::ref_option)]
pub fn serialize_optional_locale<S>(
locale: &Option<Locale>,
serializer: S
) -> Result<S::Ok, S::Error>
where
S: Serializer
{
match locale {
Some(locale) => serializer.serialize_some(&locale.to_string()),
None => serializer.serialize_none(),
}
}
pub fn deserialize_optional_locale<'de, D>(
deserializer: D
) -> Result<Option<Locale>, D::Error>
where
D: Deserializer<'de>
{
let opt_string: Option<String> = Option::deserialize(deserializer)?;
match opt_string {
Some(locale_str) => {
let locale = Locale::from_str(&locale_str)
.map_err(|error| D::Error::custom(format!(
"Unrecognized locale {locale_str:?}: {error}"
)))?;
Ok(Some(locale))
}
None => Ok(None),
}
}