From 2d91d0fbadaeb64f56d4e3b121577420175c91a7 Mon Sep 17 00:00:00 2001 From: Maciej Piechotka Date: Sat, 29 Jul 2023 00:42:16 -0700 Subject: [PATCH] Add Serialize/Deserialize implementations (#20) --- Cargo.toml | 2 ++ src/array.rs | 14 ++++++++++++++ src/map.rs | 36 ++++++++++++++++++++++++++++++++++++ src/string.rs | 14 ++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 03f61e5..cce39d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,8 @@ rustdoc-args = ["--cfg", "docsrs"] [features] map = ["indexmap"] +serde = ["dep:serde", "indexmap/serde"] [dependencies] indexmap = { version = "1", optional = true } +serde = { version = "1", optional = true } diff --git a/src/array.rs b/src/array.rs index e032ee3..582a296 100644 --- a/src/array.rs +++ b/src/array.rs @@ -221,6 +221,20 @@ where } } +#[cfg(feature = "serde")] +impl serde::Serialize for IArray { + fn serialize(&self, serializer: S) -> Result { + <[T] as serde::Serialize>::serialize(self, serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T: serde::Deserialize<'de> + ImplicitClone> serde::Deserialize<'de> for IArray { + fn deserialize>(deserializer: D) -> Result { + as serde::Deserialize>::deserialize(deserializer).map(IArray::::from) + } +} + #[cfg(test)] mod test_array { use super::*; diff --git a/src/map.rs b/src/map.rs index b11bb6c..cc76f6e 100644 --- a/src/map.rs +++ b/src/map.rs @@ -332,6 +332,42 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone + } } +#[cfg(feature = "serde")] +impl serde::Serialize for IMap +where + K: Eq + Hash + ImplicitClone + 'static + serde::Serialize, + V: PartialEq + ImplicitClone + 'static + serde::Serialize, +{ + fn serialize(&self, serializer: S) -> Result { + use serde::ser::SerializeMap; + let mut seq = serializer.serialize_map(Some(self.len()))?; + match self { + Self::Static(a) => { + for (k, v) in a.iter() { + seq.serialize_entry(k, v)?; + } + }, + Self::Rc(a) => { + for (k, v) in a.iter() { + seq.serialize_entry(k, v)?; + } + } + } + seq.end() + } +} + +#[cfg(feature = "serde")] +impl<'de, K, V> serde::Deserialize<'de> for IMap +where + K: Eq + Hash + ImplicitClone + 'static + serde::Deserialize<'de>, + V: PartialEq + ImplicitClone + 'static + serde::Deserialize<'de>, +{ + fn deserialize>(deserializer: D) -> Result { + as serde::Deserialize>::deserialize(deserializer).map(IMap::::from) + } +} + #[cfg(test)] mod test_map { use super::*; diff --git a/src/string.rs b/src/string.rs index d5ee207..719520b 100644 --- a/src/string.rs +++ b/src/string.rs @@ -147,6 +147,20 @@ impl std::borrow::Borrow for IString { } } +#[cfg(feature = "serde")] +impl serde::Serialize for IString { + fn serialize(&self, serializer: S) -> Result { + ::serialize(self, serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::Deserialize<'de> for IString{ + fn deserialize>(deserializer: D) -> Result { + ::deserialize(deserializer).map(IString::from) + } +} + #[cfg(test)] mod test_string { use super::*;