Struct serde_with::DurationSecondsWithFrac
source · [−]pub struct DurationSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(_);
Expand description
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 Type | Converter | Available FORMAT s |
---|---|---|
std::time::Duration | DurationSeconds | u64 , f64 , String |
std::time::Duration | DurationSecondsWithFrac | f64 , String |
chrono::Duration | DurationSeconds | i64 , f64 , String |
chrono::Duration | DurationSecondsWithFrac | f64 , 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
sourceimpl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for DurationSecondsWithFrac<FORMAT, STRICTNESS>
impl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for DurationSecondsWithFrac<FORMAT, STRICTNESS>
sourcefn clone(&self) -> DurationSecondsWithFrac<FORMAT, STRICTNESS>
fn clone(&self) -> DurationSecondsWithFrac<FORMAT, STRICTNESS>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for DurationSecondsWithFrac<FORMAT, STRICTNESS>
impl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for DurationSecondsWithFrac<FORMAT, STRICTNESS>
sourceimpl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for DurationSecondsWithFrac<FORMAT, STRICTNESS>
impl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for DurationSecondsWithFrac<FORMAT, STRICTNESS>
sourcefn default() -> DurationSecondsWithFrac<FORMAT, STRICTNESS>
fn default() -> DurationSecondsWithFrac<FORMAT, STRICTNESS>
Returns the “default value” for a type. Read more
sourceimpl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
sourcefn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer.
sourceimpl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
sourcefn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer.
sourceimpl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible> where
FORMAT: Format,
impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible> where
FORMAT: Format,
sourcefn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer.
sourceimpl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS> where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS> where
STRICTNESS: Strictness,
sourcefn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
Serialize this value into the given Serde serializer.
sourceimpl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS> where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS> where
STRICTNESS: Strictness,
sourcefn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
fn serialize_as<S>(source: &Duration, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
Serialize this value into the given Serde serializer.
impl<FORMAT: Copy + Format, STRICTNESS: Copy + Strictness> Copy for DurationSecondsWithFrac<FORMAT, STRICTNESS>
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
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more