]> git.lizzy.rs Git - enumset.git/commitdiff
Add optional feature which implements ser/de for EnumSet.
authorboxdot <d@zerovolt.org>
Thu, 13 Dec 2018 15:57:54 +0000 (16:57 +0100)
committerboxdot <d@zerovolt.org>
Thu, 13 Dec 2018 15:59:07 +0000 (16:59 +0100)
enumset/Cargo.toml
enumset/src/lib.rs

index 074f17e0fec8ee774df9c0c6e928e083ef6ee81e..86fac142e0bb2f54b91f324ac26d037df3e27a52 100644 (file)
@@ -18,4 +18,5 @@ nightly = ["enumset_derive/nightly"]
 
 [dependencies]
 enumset_derive = { version = "0.2.0", path = "../enumset_derive" }
-num-traits = { version = "0.2", default-features = false }
\ No newline at end of file
+num-traits = { version = "0.2", default-features = false }
+serde = { version = "1.0", optional = true }
index 679b4700650cbf858cf01d8168b1967d7a20b970..04b76f75bab871d5b13e61c2fa7b6771cd4835b0 100644 (file)
@@ -74,6 +74,7 @@
 #[cfg(test)] extern crate core;
 extern crate enumset_derive;
 extern crate num_traits;
+#[cfg(feature = "serde")] extern crate serde;
 
 pub use enumset_derive::*;
 mod enumset { pub use super::*; }
@@ -426,6 +427,26 @@ impl <T : EnumSetType + Debug> Debug for EnumSet<T> {
     }
 }
 
+#[cfg(feature = "serde")]
+impl <T : EnumSetType > serde::Serialize for EnumSet<T> {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: serde::Serializer,
+    {
+        serializer.serialize_u128(self.to_bits())
+    }
+}
+
+#[cfg(feature = "serde")]
+impl <'de, T : EnumSetType > serde::Deserialize<'de> for EnumSet<T> {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        u128::deserialize(deserializer).map(EnumSet::from_bits)
+    }
+}
+
 /// The iterator used by [`EnumSet`](./struct.EnumSet.html).
 #[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)]
 pub struct EnumSetIter<T : EnumSetType>(EnumSet<T>, u8);