// This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::LanguageIdentifier; use alloc::string::ToString; 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 core::fmt::Formatter<'_>) -> core::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 json() { use crate::langid; use crate::subtags::{Language, Region, Script}; assert_eq!( serde_json::to_string(&langid!("en-US")).unwrap(), r#""en-US""# ); assert_eq!( serde_json::from_str::(r#""en-US""#).unwrap(), langid!("en-US") ); assert!(serde_json::from_str::(r#""2Xs""#).is_err()); assert_eq!( serde_json::to_string(&"fr".parse::().unwrap()).unwrap(), r#""fr""# ); assert_eq!( serde_json::from_str::(r#""fr""#).unwrap(), "fr".parse::().unwrap() ); assert!(serde_json::from_str::(r#""2Xs""#).is_err()); assert_eq!( serde_json::to_string(&"Latn".parse::