use crate::LanguageIdentifier; use serde::{Deserialize, Deserializer, Serialize, Serializer}; impl Serialize for LanguageIdentifier { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&self.to_string()) } } impl<'de> Deserialize<'de> for LanguageIdentifier { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct LanguageIdentifierVisitor; impl<'de> serde::de::Visitor<'de> for LanguageIdentifierVisitor { type Value = LanguageIdentifier; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(formatter, "A valid Unicode Language Identifier") } fn visit_str(self, s: &str) -> Result where E: serde::de::Error, { s.parse::() .map_err(serde::de::Error::custom) } } deserializer.deserialize_string(LanguageIdentifierVisitor) } } #[test] fn serialize() -> Result<(), Box> { let fr = serde_json::json!("fr".parse::()?); let en = serde_json::json!("en-US".parse::()?); assert_eq!(serde_json::to_string(&fr)?, r#""fr""#); assert_eq!(serde_json::to_string(&en)?, r#""en-US""#); Ok(()) } #[test] fn deserialize() -> Result<(), Box> { let fr = serde_json::from_str::(r#""fr""#)?; let en = serde_json::from_str::(r#""en-US""#)?; assert_eq!(fr, "fr".parse::()?); assert_eq!(en, "en-US".parse::()?); Ok(()) }