1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use crate::{SmartString, SmartStringMode}; use alloc::string::String; use core::{fmt, marker::PhantomData}; use serde::{ de::{Error, Visitor}, Deserialize, Deserializer, Serialize, Serializer, }; impl<T: SmartStringMode> Serialize for SmartString<T> { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { serializer.serialize_str(self) } } impl<'de, T: SmartStringMode> Deserialize<'de> for SmartString<T> { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { deserializer .deserialize_string(SmartStringVisitor(PhantomData)) .map(SmartString::from) } } struct SmartStringVisitor<T: SmartStringMode>(PhantomData<*const T>); impl<'de, T: SmartStringMode> Visitor<'de> for SmartStringVisitor<T> { type Value = SmartString<T>; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a string") } fn visit_string<E>(self, v: String) -> Result<Self::Value, E> where E: Error, { Ok(SmartString::from(v)) } fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: Error, { Ok(SmartString::from(v)) } } #[cfg(test)] mod test { use super::*; use crate::Compact; #[test] fn test_ser_de() { use serde_test::{assert_tokens, Token}; let strings = [ "", "small test", "longer than inline string for serde testing", ]; for &string in strings.iter() { let value = SmartString::<Compact>::from(string); assert_tokens(&value, &[Token::String(string)]); } } }