diff --git a/Cargo.toml b/Cargo.toml index a07b5fa..b2c1775 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ categories = ["embedded", "no-std", "data-structures"] [dependencies] +serde = { version = "1", optional = true } [features] default = ["std"] @@ -22,4 +23,4 @@ std = [] [badges] travis-ci = {repository = "kjetilkjeka/uX", branch = "master"} -maintenance = {status = "actively-developed"} \ No newline at end of file +maintenance = {status = "actively-developed"} diff --git a/src/lib.rs b/src/lib.rs index bc1ddaf..2803f6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,8 @@ #![cfg_attr(not(feature="std"), no_std)] +#[cfg(feature = "serde")] +extern crate serde; mod lib { pub mod core { @@ -184,6 +186,26 @@ macro_rules! implement_common { } + #[cfg(feature = "serde")] + impl $crate::serde::Serialize for $name { + fn serialize(&self, serializer: S) -> Result { + self.0.serialize(serializer) + } + } + + #[cfg(feature = "serde")] + impl<'de> $crate::serde::Deserialize<'de> for $name { + fn deserialize>(deserializer: D) -> Result<$name, D::Error> { + let value = <$type as $crate::serde::Deserialize<'de>>::deserialize(deserializer)?; + + if value <= $name::MAX.0 && value >= $name::MIN.0 { + Ok($name(value)) + } + else { + Err($crate::serde::de::Error::custom("out of bounds")) + } + } + } impl PartialEq for $name { fn eq(&self, other: &Self) -> bool {