//! Implement [`Serialize`] and [`Deserialize`] for [`Check`] and [`Ck`]. use crate::{Check, Ck, Invariant}; use serde::de::{Deserialize, Deserializer, Error}; use serde::ser::{Serialize, Serializer}; impl> Serialize for Check { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl Serialize for Ck { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de, I, B> Deserialize<'de> for Check where I: Invariant, B: AsRef + Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let buf = Deserialize::deserialize(deserializer)?; Check::from_buf(buf).map_err(Error::custom) } } impl<'de: 'a, 'a, I: Invariant> Deserialize<'de> for &'a Ck { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let slice = Deserialize::deserialize(deserializer)?; Ck::from_slice(slice).map_err(Error::custom) } } #[cfg(test)] mod tests { use serde::{Deserialize, Serialize}; use strck_ident::{Ident, IntoCk}; #[derive(Serialize, Deserialize, Debug, PartialEq)] struct Player<'a> { #[serde(borrow)] username: &'a Ident, level: u32, } #[test] fn test_zero_copy_deserialization() { let qnn = Player { username: "qnn".ck().unwrap(), level: 100, }; fn get() -> Player<'static> { let ser = r#"{"username":"qnn","level":100}"#; serde_json::from_str(&ser).unwrap() } let de = get(); assert_eq!(qnn, de); } }