1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//! Potentially useful shims for the standard library
//!
//! To enable `std` shims, add it to the crate features list:
//!
//! ```toml
//! [dependencies]
//! std_serde_shims = "0.2"
//! ```
extern crate serde;
use serde::ser::{Serialize, Serializer};
/// `Option` shims
pub mod option {
use super::*;
/// Serializes `None` as `Some(Default)`
///
/// Useful for avoiding null values with integers.
///
/// Full Example:
///
/// ```
/// #[macro_use]
/// extern crate serde_derive;
/// extern crate serde_json;
/// extern crate std_serde_shims;
///
/// #[derive(Debug, PartialEq, Serialize, Deserialize)]
/// struct Test {
/// /// Many web APIs consider zero to be no limit, but we want our API to use `Option` instead
/// #[serde(serialize_with = "std_serde_shims::option::serialize_none_as_default")]
/// item_limit: Option<u64>,
/// }
///
/// fn main() {
/// let none_test = Test {
/// item_limit: None
/// };
///
/// assert_eq!(serde_json::to_string(&none_test).unwrap(), r#"{"item_limit":0}"#);
/// }
/// ```
pub fn serialize_none_as_default<S, T>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize + Default,
{
match value {
Some(value) => value.serialize(serializer),
None => T::default().serialize(serializer),
}
}
}