From 9b040e0a464ee716d387582f167caf3cd23b6cba Mon Sep 17 00:00:00 2001 From: "radix@twistedmatrix.com" Date: Wed, 27 Dec 2017 16:36:17 -0600 Subject: [PATCH] Implement `serde::ser::Serialize` and `serde::de::Deserialize`. Fixes #37. --- Cargo.toml | 1 + README.md | 11 +++++++---- src/lib.rs | 15 +++++++++++---- src/system.rs | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dec1457f..39f1381a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ maintenance = { status = "actively-developed" } [dependencies] num = "0.1" +serde = { version = "1.0", optional = true } typenum = "1.9.0" [dev-dependencies] diff --git a/README.md b/README.md index 36997595..cb7a6ce5 100644 --- a/README.md +++ b/README.md @@ -63,10 +63,10 @@ See the [examples](examples) directory for more advanced usage: ## Features `uom` has multiple `Cargo` features for controlling available underlying storage types, the -inclusion of the pre-built [International System of Units][si] (SI), and `no_std` functionality. The -features are described below. `f32`, `f64`, `std`, and `si` are enabled by default. Features can be -cherry-picked by using the `--no-default-features` and `--features "..."` flags when compiling `uom` -or specifying features in Cargo.toml: +inclusion of the pre-built [International System of Units][si] (SI), support for [Serde][serde], and +`no_std` functionality. The features are described below. `f32`, `f64`, `std`, and `si` are enabled +by default. Features can be cherry-picked by using the `--no-default-features` and +`--features "..."` flags when compiling `uom` or specifying features in Cargo.toml: ```toml [dependencies] @@ -88,12 +88,15 @@ uom = { `rational`, `rational32`, `rational64`, `bigrational`, `f32`, `f64` -- Features to enable underlying storage types. At least one of these features must be enabled. `f32` and `f64` are enabled by default. + * `serde` -- Feature to enable support for serialization and deserialization of quantities with + the [serde][serde] crate. * `si` -- Feature to include the pre-built [International System of Units][si] (SI). Enabled by default. * `std` -- Feature to compile with standard library support. Disabling this feature compiles `uom` with `no_std`. Enabled by default. [si]: http://jcgm.bipm.org/vim/en/1.16.html +[serde]: https://serde.rs/ ## Design Rather than working with [measurement units](http://jcgm.bipm.org/vim/en/1.9.html) (meter, diff --git a/src/lib.rs b/src/lib.rs index c1bd2869..b694fe10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,10 +52,10 @@ //! //! ## Features //! `uom` has multiple `Cargo` features for controlling available underlying storage types, the -//! inclusion of the pre-built [International System of Units][si] (SI), and `no_std` functionality. -//! The features are described below. `f32`, `f64`, `std`, and `si` are enabled by default. Features -//! can be cherry-picked by using the `--no-default-features` and `--features "..."` flags when -//! compiling `uom` or specifying features in Cargo.toml: +//! inclusion of the pre-built [International System of Units][si] (SI), support for [Serde][serde], +//! and `no_std` functionality. The features are described below. `f32`, `f64`, `std`, and `si` are +//! enabled by default. Features can be cherry-picked by using the `--no-default-features` and +//! `--features "..."` flags when compiling `uom` or specifying features in Cargo.toml: //! //! ```toml //! [dependencies] @@ -77,12 +77,15 @@ //! `rational`, `rational32`, `rational64`, `bigrational`, `f32`, `f64` -- Features to enable //! underlying storage types. At least one of these features must be enabled. `f32` and `f64` are //! enabled by default. +//! * `serde` -- Feature to enable support for serialization and deserialization of quantities with +//! the [serde][serde] crate. //! * `si` -- Feature to include the pre-built [International System of Units][si] (SI). Enabled by //! default. //! * `std` -- Feature to compile with standard library support. Disabling this feature compiles //! `uom` with `no_std`. Enabled by default. //! //! [si]: http://jcgm.bipm.org/vim/en/1.16.html +//! [serde]: https://serde.rs/ //! //! ## Design //! Rather than working with [measurement units](http://jcgm.bipm.org/vim/en/1.9.html) (meter, @@ -156,6 +159,10 @@ compile_error!("A least one underlying storage type must be enabled. See the fea #[doc(hidden)] pub extern crate num; +#[doc(hidden)] +#[cfg(feature = "serde")] +pub extern crate serde; + #[doc(hidden)] pub extern crate typenum; diff --git a/src/system.rs b/src/system.rs index 6e4a8b39..5c8157fa 100644 --- a/src/system.rs +++ b/src/system.rs @@ -858,6 +858,42 @@ macro_rules! system { } } + #[cfg(feature = "serde")] + impl $crate::serde::ser::Serialize for Quantity + where + D: Dimension + ?Sized, + U: Units + ?Sized, + V: $crate::num::Num + $crate::Conversion + $crate::serde::ser::Serialize, + { + fn serialize(&self, serializer: S) -> Result + where + S: $crate::serde::ser::Serializer + { + self.value.serialize(serializer) + } + } + + #[cfg(feature = "serde")] + impl<'de, D, U, V> $crate::serde::de::Deserialize<'de> for Quantity + where + D: Dimension + ?Sized, + U: Units + ?Sized, + V: $crate::num::Num + $crate::Conversion + $crate::serde::de::Deserialize<'de>, + { + fn deserialize(deserializer: De) -> Result + where + De: $crate::serde::de::Deserializer<'de>, + { + let value: V = $crate::serde::de::Deserialize::deserialize(deserializer)?; + + Ok(Quantity { + dimension: $crate::lib::marker::PhantomData, + units: $crate::lib::marker::PhantomData, + value, + }) + } + } + /// Macro to implement [`quantity`](si/struct.Quantity.html) type aliases for a specific /// [system of units][units] and value storage type. ///