From 4e8199b572f2035b7749cba276ece3a26630d23e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:18:21 +0200 Subject: Adding upstream version 1.67.1+dfsg1. Signed-off-by: Daniel Baumann --- vendor/icu_locid/src/serde.rs | 135 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 vendor/icu_locid/src/serde.rs (limited to 'vendor/icu_locid/src/serde.rs') diff --git a/vendor/icu_locid/src/serde.rs b/vendor/icu_locid/src/serde.rs new file mode 100644 index 000000000..3bfe30388 --- /dev/null +++ b/vendor/icu_locid/src/serde.rs @@ -0,0 +1,135 @@ +// 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::