use convert_case::Casing;
use serde::de::Deserializer;
#[allow(missing_docs)]
#[derive(
Copy,
Clone,
Debug,
PartialEq,
Eq,
PartialOrd,
Ord,
Default,
Hash,
serde::Deserialize,
serde::Serialize,
derive_more::Display,
derive_more::FromStr,
strum::EnumIter,
)]
pub enum StreetSeparator {
#[default]
OfThe,
}
impl StreetSeparator {
#[tracing::instrument]
pub fn upper(&self) -> String {
self.to_string().to_case(convert_case::Case::Upper)
}
#[tracing::instrument]
pub fn label(&self) -> String {
let label = match self {
Self::OfThe => "OF THE",
};
label.to_string()
}
#[tracing::instrument]
pub fn match_mixed(input: &str) -> Option<Self> {
match input.to_lowercase().as_str() {
"of the" => Some(Self::OfThe),
_ => None,
}
}
#[tracing::instrument(skip_all)]
pub fn deserialize_mixed<'de, D: Deserializer<'de>>(de: D) -> Result<Option<Self>, D::Error> {
let intermediate = serde::Deserialize::deserialize(de)?;
Ok(Self::match_mixed(intermediate))
}
}
#[test]
#[tracing::instrument]
fn separator_labels() -> Result<(), String> {
use strum::IntoEnumIterator;
for name in StreetSeparator::iter() {
let label = name.label();
let upper = name.upper();
assert_eq!(label, upper);
}
Ok(())
}