Struct serde_with::DurationSecondsWithFrac[][src]

pub struct DurationSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(_);

De/Serialize Durations as number of seconds.

De/serialize durations as number of seconds with subsecond precision. Subsecond precision is only supported for DurationSecondsWithFrac, but not for DurationSeconds. You can configure the serialization format between integers, floats, and stringified numbers with the FORMAT specifier and configure the deserialization with the STRICTNESS specifier.

The STRICTNESS specifier can either be formats::Strict or formats::Flexible and defaults to formats::Strict. formats::Strict means that deserialization only supports the type given in FORMAT, e.g., if FORMAT is u64 deserialization from a f64 will error. formats::Flexible means that deserialization will perform a best effort to extract the correct duration and allows deserialization from any type. For example, deserializing DurationSeconds<f64, Flexible> will discard any subsecond precision during deserialization from f64 and will parse a String as an integer number.

This type also supports chrono::Duration with the chrono-feature flag.

Duration TypeConverterAvailable FORMATs
std::time::DurationDurationSecondsu64, f64, String
std::time::DurationDurationSecondsWithFracf64, String
chrono::DurationDurationSecondsi64, f64, String
chrono::DurationDurationSecondsWithFracf64, String

Examples

use std::time::Duration;

#[serde_as]
#[derive(Deserialize, Serialize)]
struct Durations {
    #[serde_as(as = "DurationSecondsWithFrac<f64>")]
    d_f64: Duration,
    #[serde_as(as = "DurationSecondsWithFrac<String>")]
    d_string: Duration,
};

// Serialization
// See how the values get rounded, since subsecond precision is not allowed.

let d = Durations {
    d_f64: Duration::new(12345, 500_000_000), // Create from seconds and nanoseconds
    d_string: Duration::new(12345, 999_999_000),
};
// Observe the different datatypes
let expected = json!({
    "d_f64": 12345.5,
    "d_string": "12345.999999",
});
assert_eq!(expected, serde_json::to_value(&d).unwrap());

// Deserialization works too
// Subsecond precision in numbers will be rounded away

let json = json!({
    "d_f64": 12345.5,
    "d_string": "12345.987654",
});
let expected = Durations {
    d_f64: Duration::new(12345, 500_000_000), // Create from seconds and nanoseconds
    d_string: Duration::new(12345, 987_654_000),
};
assert_eq!(expected, serde_json::from_value(json).unwrap());

chrono::Duration is also supported when using the chrono feature. It is a signed duration, thus can be de/serialized as an i64 instead of a u64.

use chrono::Duration;

#[serde_as]
#[derive(Deserialize, Serialize)]
struct Durations {
    #[serde_as(as = "DurationSecondsWithFrac<f64>")]
    d_f64: Duration,
    #[serde_as(as = "DurationSecondsWithFrac<String>")]
    d_string: Duration,
};

// Serialization

let d = Durations {
    d_f64: Duration::seconds(-12345) + Duration::milliseconds(500),
    d_string: Duration::seconds(12345) + Duration::nanoseconds(999_999_000),
};
// Observe the different datatypes
let expected = json!({
    "d_f64": -12344.5,
    "d_string": "12345.999999",
});
assert_eq!(expected, serde_json::to_value(&d).unwrap());

// Deserialization works too

let json = json!({
    "d_f64": -12344.5,
    "d_string": "12345.987",
});
let expected = Durations {
    d_f64: Duration::seconds(-12345) + Duration::milliseconds(500),
    d_string: Duration::seconds(12345) + Duration::milliseconds(987),
};
assert_eq!(expected, serde_json::from_value(json).unwrap());

Trait Implementations

impl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

fn clone(&self) -> DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

Formats the value using the given formatter. Read more

impl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

fn default() -> DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

Returns the “default value” for a type. Read more

impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible> where
    FORMAT: Format
[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible> where
    FORMAT: Format
[src]

fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
    D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer.

impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS> where
    STRICTNESS: Strictness
[src]

fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
    S: Serializer
[src]

Serialize this value into the given Serde serializer.

impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS> where
    STRICTNESS: Strictness
[src]

fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
    S: Serializer
[src]

Serialize this value into the given Serde serializer.

impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS> where
    STRICTNESS: Strictness
[src]

fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
    S: Serializer
[src]

Serialize this value into the given Serde serializer.

impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS> where
    STRICTNESS: Strictness
[src]

fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
    S: Serializer
[src]

Serialize this value into the given Serde serializer.

impl<FORMAT: Copy + Format, STRICTNESS: Copy + Strictness> Copy for DurationSecondsWithFrac<FORMAT, STRICTNESS>[src]

Auto Trait Implementations

impl<FORMAT, STRICTNESS> RefUnwindSafe for DurationSecondsWithFrac<FORMAT, STRICTNESS> where
    FORMAT: RefUnwindSafe,
    STRICTNESS: RefUnwindSafe

impl<FORMAT, STRICTNESS> Send for DurationSecondsWithFrac<FORMAT, STRICTNESS> where
    FORMAT: Send,
    STRICTNESS: Send

impl<FORMAT, STRICTNESS> Sync for DurationSecondsWithFrac<FORMAT, STRICTNESS> where
    FORMAT: Sync,
    STRICTNESS: Sync

impl<FORMAT, STRICTNESS> Unpin for DurationSecondsWithFrac<FORMAT, STRICTNESS> where
    FORMAT: Unpin,
    STRICTNESS: Unpin

impl<FORMAT, STRICTNESS> UnwindSafe for DurationSecondsWithFrac<FORMAT, STRICTNESS> where
    FORMAT: UnwindSafe,
    STRICTNESS: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.