use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum Title {
#[serde(rename = "DR")]
Dr,
#[serde(rename = "PROF")]
Prof,
#[serde(rename = "PROF_DR")]
ProfDr,
}
impl Title {
pub fn german_name(&self) -> &'static str {
match self {
Self::Dr => "Dr.",
Self::Prof => "Prof.",
Self::ProfDr => "Prof. Dr.",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
assert_eq!(serde_json::to_string(&Title::Dr).unwrap(), r#""DR""#);
assert_eq!(serde_json::to_string(&Title::Prof).unwrap(), r#""PROF""#);
assert_eq!(
serde_json::to_string(&Title::ProfDr).unwrap(),
r#""PROF_DR""#
);
}
#[test]
fn test_deserialize() {
assert_eq!(serde_json::from_str::<Title>(r#""DR""#).unwrap(), Title::Dr);
assert_eq!(
serde_json::from_str::<Title>(r#""PROF_DR""#).unwrap(),
Title::ProfDr
);
}
#[test]
fn test_roundtrip() {
for title in [Title::Dr, Title::Prof, Title::ProfDr] {
let json = serde_json::to_string(&title).unwrap();
let parsed: Title = serde_json::from_str(&json).unwrap();
assert_eq!(title, parsed);
}
}
}