Skip to content

Commit

Permalink
add const generic numeric compact deserialization helpers (#37)
Browse files Browse the repository at this point in the history
* add const generic numeric compact deserialization helpers

* add u16 and i16; fix docs
  • Loading branch information
olekspickle authored Jan 12, 2024
1 parent 3ebaa60 commit 6436d99
Showing 1 changed file with 145 additions and 0 deletions.
145 changes: 145 additions & 0 deletions src/field_attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,151 @@ pub fn bool_true() -> bool {
true
}

/// Allows compact setting `u16` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_u16::<30>")]
/// default_30: u16,
/// #[serde(default)]
/// default_zero: u16,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, 30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_u16<const V: u16>() -> u16 {
V
}


/// Allows compact setting `u32` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_u32::<30>")]
/// default_30: u32,
/// #[serde(default)]
/// default_zero: u32,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, 30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_u32<const V: u32>() -> u32 {
V
}

/// Allows compact setting `u64` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_u64::<30>")]
/// default_30: u64,
/// #[serde(default)]
/// default_zero: u64,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, 30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_u64<const V: u64>() -> u64 {
V
}

/// Allows compact setting `i16` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_i16::<-30>")]
/// default_30: i16,
/// #[serde(default)]
/// default_zero: i16,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, -30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_i16<const V: i16>() -> i16 {
V
}

/// Allows compact setting `i32` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_i32::<-30>")]
/// default_30: i32,
/// #[serde(default)]
/// default_zero: i32,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, -30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_i32<const V: i32>() -> i32 {
V
}

/// Allows compact setting `i64` field default value.
///
/// # Example
/// ```rust
/// use serde_aux::prelude::*;
///
/// #[derive(serde::Deserialize, Debug)]
/// struct MyStruct {
/// #[serde(default = "default_i64::<-30>")]
/// default_30: i64,
/// #[serde(default)]
/// default_zero: i64,
/// }
///
/// let s = r#"{}"#;
/// let a: MyStruct = serde_json::from_str(s).unwrap();
/// assert_eq!(a.default_30, -30);
/// assert_eq!(a.default_zero, 0);
/// ```
#[inline]
pub const fn default_i64<const V: i64>() -> i64 {
V
}

/// Deserializes a `chrono::DateTime<Utc>` from a milliseconds time stamp. Useful when the data is coming from a number
/// which is not a seconds time stamp but milliseconds one. It also handles the string to number conversion if the
/// data was passed as a string with number inside like **"1519927261900"**.
Expand Down

0 comments on commit 6436d99

Please sign in to comment.