From 9f2f6841888e1481140fe396a36f26c566d07a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Laignel?= Date: Sat, 28 Jul 2018 17:23:45 +0200 Subject: [PATCH] format: serde: avoid redundant `()` for some types --- gstreamer/src/format.rs | 99 ------------------------- gstreamer/src/format_serde.rs | 132 ++++++++++++++++++++++++++++++++++ gstreamer/src/lib.rs | 2 + gstreamer/src/value_serde.rs | 4 +- 4 files changed, 136 insertions(+), 101 deletions(-) create mode 100644 gstreamer/src/format_serde.rs diff --git a/gstreamer/src/format.rs b/gstreamer/src/format.rs index 16e0e4c1d..4aa2e9db5 100644 --- a/gstreamer/src/format.rs +++ b/gstreamer/src/format.rs @@ -24,13 +24,10 @@ pub enum GenericFormattedValue { } #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Debug, Default)] -#[cfg_attr(feature = "ser_de", derive(Serialize, Deserialize))] pub struct Default(pub Option); #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Debug, Default)] -#[cfg_attr(feature = "ser_de", derive(Serialize, Deserialize))] pub struct Bytes(pub Option); #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Debug, Default)] -#[cfg_attr(feature = "ser_de", derive(Serialize, Deserialize))] pub struct Buffers(pub Option); pub type Time = ClockTime; @@ -486,99 +483,3 @@ impl_format_value_traits!(Default, Default, Default); impl_format_value_traits!(Bytes, Bytes, Bytes); impl_format_value_traits!(ClockTime, Time, Time); impl_format_value_traits!(Buffers, Buffers, Buffers); - -#[cfg(test)] -mod tests { - #[cfg(feature = "ser_de")] - #[test] - fn test_serialize() { - extern crate ron; - extern crate serde_json; - - use super::Buffers; - use super::Bytes; - use super::Default; - use ClockTime; - use Format; - use GenericFormattedValue; - - ::init().unwrap(); - - let mut pretty_config = ron::ser::PrettyConfig::default(); - pretty_config.new_line = "".to_string(); - - let value = GenericFormattedValue::Undefined(42); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Undefined(42)".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Undefined\":42}".to_owned(), res); - - let value = GenericFormattedValue::Default(Default(Some(42))); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Default((Some(42)))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Default\":42}".to_owned(), res); - - let value = GenericFormattedValue::Default(Default(None)); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Default((None))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Default\":null}".to_owned(), res); - - let value = GenericFormattedValue::Bytes(Bytes(Some(42))); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Bytes((Some(42)))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Bytes\":42}".to_owned(), res); - - let value = GenericFormattedValue::Time(ClockTime::from_nseconds(42_123_456_789)); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Time(Some(42123456789))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Time\":42123456789}".to_owned(), res); - - let value = GenericFormattedValue::Buffers(Buffers(Some(42))); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Buffers((Some(42)))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Buffers\":42}".to_owned(), res); - - let value = GenericFormattedValue::Percent(Some(42)); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Percent(Some(42))".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Percent\":42}".to_owned(), res); - - let value = GenericFormattedValue::Other(Format::Percent, 42); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Other(Percent, 42)".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Other\":[\"Percent\",42]}".to_owned(), res); - - let value = GenericFormattedValue::Other(Format::__Unknown(7), 42); - let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); - assert_eq!(Ok("Other(__Unknown(7), 42)".to_owned()), res); - let res = serde_json::to_string(&value).unwrap(); - assert_eq!("{\"Other\":[{\"__Unknown\":7},42]}".to_owned(), res); - } - - #[cfg(feature = "ser_de")] - #[test] - fn test_deserialize() { - extern crate ron; - extern crate serde_json; - - use Format; - use GenericFormattedValue; - - ::init().unwrap(); - - let format_ron = "Other(Percent, 42)"; - let format: GenericFormattedValue = ron::de::from_str(format_ron).unwrap(); - assert_eq!(format, GenericFormattedValue::Other(Format::Percent, 42)); - - let format_json = "{\"Other\":[\"Percent\",42]}"; - let format: GenericFormattedValue = serde_json::from_str(format_json).unwrap(); - assert_eq!(format, GenericFormattedValue::Other(Format::Percent, 42)); - } -} diff --git a/gstreamer/src/format_serde.rs b/gstreamer/src/format_serde.rs new file mode 100644 index 000000000..9eef6df3c --- /dev/null +++ b/gstreamer/src/format_serde.rs @@ -0,0 +1,132 @@ +// Copyright (C) 2018 François Laignel +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use serde::de::{Deserialize, Deserializer}; +use serde::ser::{Serialize, Serializer}; + +use format::{Buffers, Bytes, Default}; + +// Manual implementation for some types that would otherwise yield representations such as: +// "Default((Some(42)))" +macro_rules! impl_ser_de( + ($t:ident) => { + impl Serialize for $t { + fn serialize(&self, serializer: S) -> Result { + self.0.serialize(serializer) + } + } + + + impl<'de> Deserialize<'de> for $t { + fn deserialize>(deserializer: D) -> Result { + Option::::deserialize(deserializer).map(|value| $t(value)) + } + } + } +); + +impl_ser_de!(Buffers); +impl_ser_de!(Bytes); +impl_ser_de!(Default); + +#[cfg(test)] +mod tests { + extern crate ron; + extern crate serde_json; + + use format::Default; + use Format; + use GenericFormattedValue; + + #[test] + fn test_serialize() { + use format::Buffers; + use format::Bytes; + use ClockTime; + + ::init().unwrap(); + + let mut pretty_config = ron::ser::PrettyConfig::default(); + pretty_config.new_line = "".to_string(); + + let value = GenericFormattedValue::Undefined(42); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Undefined(42)".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Undefined\":42}".to_owned(), res); + + let value = GenericFormattedValue::Default(Default(Some(42))); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Default(Some(42))".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Default\":42}".to_owned(), res); + + let value = GenericFormattedValue::Default(Default(None)); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Default(None)".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Default\":null}".to_owned(), res); + + let value = GenericFormattedValue::Bytes(Bytes(Some(42))); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Bytes(Some(42))".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Bytes\":42}".to_owned(), res); + + let value = GenericFormattedValue::Time(ClockTime::from_nseconds(42_123_456_789)); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Time(Some(42123456789))".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Time\":42123456789}".to_owned(), res); + + let value = GenericFormattedValue::Buffers(Buffers(Some(42))); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Buffers(Some(42))".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Buffers\":42}".to_owned(), res); + + let value = GenericFormattedValue::Percent(Some(42)); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Percent(Some(42))".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Percent\":42}".to_owned(), res); + + let value = GenericFormattedValue::Other(Format::Percent, 42); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Other(Percent, 42)".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Other\":[\"Percent\",42]}".to_owned(), res); + + let value = GenericFormattedValue::Other(Format::__Unknown(7), 42); + let res = ron::ser::to_string_pretty(&value, pretty_config.clone()); + assert_eq!(Ok("Other(__Unknown(7), 42)".to_owned()), res); + let res = serde_json::to_string(&value).unwrap(); + assert_eq!("{\"Other\":[{\"__Unknown\":7},42]}".to_owned(), res); + } + + #[test] + fn test_deserialize() { + ::init().unwrap(); + + let format_ron = "Default(Some(42))"; + let format: GenericFormattedValue = ron::de::from_str(format_ron).unwrap(); + assert_eq!(format, GenericFormattedValue::Default(Default(Some(42)))); + + let format_json = "{\"Default\":42}"; + let format: GenericFormattedValue = serde_json::from_str(format_json).unwrap(); + assert_eq!(format, GenericFormattedValue::Default(Default(Some(42)))); + + let format_ron = "Other(Percent, 42)"; + let format: GenericFormattedValue = ron::de::from_str(format_ron).unwrap(); + assert_eq!(format, GenericFormattedValue::Other(Format::Percent, 42)); + + let format_json = "{\"Other\":[\"Percent\",42]}"; + let format: GenericFormattedValue = serde_json::from_str(format_json).unwrap(); + assert_eq!(format, GenericFormattedValue::Other(Format::Percent, 42)); + } +} diff --git a/gstreamer/src/lib.rs b/gstreamer/src/lib.rs index c1b6a1051..6d0a5eeb7 100644 --- a/gstreamer/src/lib.rs +++ b/gstreamer/src/lib.rs @@ -214,6 +214,8 @@ pub use typefind::*; pub mod format; pub use format::{FormattedValue, GenericFormattedValue, SpecificFormattedValue}; +#[cfg(feature = "ser_de")] +pub(crate) mod format_serde; mod segment; pub use segment::*; diff --git a/gstreamer/src/value_serde.rs b/gstreamer/src/value_serde.rs index af2dc45ff..2bbfff272 100644 --- a/gstreamer/src/value_serde.rs +++ b/gstreamer/src/value_serde.rs @@ -55,7 +55,7 @@ impl<'a> Serialize for Fraction { impl<'de> Deserialize<'de> for Fraction { fn deserialize>(deserializer: D) -> Result { Rational32::deserialize(deserializer) - .and_then(|rational| Ok(Fraction::new(*rational.numer(), *rational.denom()))) + .map(|rational| Fraction::new(*rational.numer(), *rational.denom())) } } @@ -165,7 +165,7 @@ macro_rules! de_value( { let value = $seq .next_element::<$t>()? - .and_then(|base_value| Some(base_value.to_value())); + .map(|base_value| base_value.to_value()); Ok(value) } );