pub struct DurationSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(/* private fields */);
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.
Serialization of integers will round the duration to the nearest value.
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.
This type also supports time::Duration
with the time_0_3
-feature flag.
This table lists the available FORMAT
s for the different duration types.
The FORMAT
specifier defaults to u64
/f64
.
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 |
time::Duration | DurationSeconds | i64 , f64 , String |
time::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 data types
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_0_4
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 data types
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§
source§impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
source§fn 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>,
source§impl<'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,
source§fn 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>,
source§impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature time_0_3
only.
impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
source§fn 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>,
source§impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<String, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, Duration> for DurationSecondsWithFrac<f64, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<Time03Duration, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<f64, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<f64, Strict>
chrono_0_4
only.source§fn 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>,
source§impl<'de, FORMAT> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature chrono_0_4
only.
impl<'de, FORMAT> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
chrono_0_4
only.source§fn 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>,
source§impl<'de> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<String, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, TimeDelta> for DurationSecondsWithFrac<String, Strict>
chrono_0_4
only.source§fn 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>,
source§impl<T, F> JsonSchemaAs<T> for DurationSecondsWithFrac<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_8
only.
impl<T, F> JsonSchemaAs<T> for DurationSecondsWithFrac<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_0_8
only.source§fn schema_name() -> String
fn schema_name() -> String
source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
source§fn json_schema(gen: &mut SchemaGenerator) -> Schema
fn json_schema(gen: &mut SchemaGenerator) -> Schema
source§fn is_referenceable() -> bool
fn is_referenceable() -> bool
$ref
keyword. Read moresource§impl<T, F> JsonSchemaAs<T> for DurationSecondsWithFrac<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_8
only.
impl<T, F> JsonSchemaAs<T> for DurationSecondsWithFrac<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_0_8
only.source§fn schema_name() -> String
fn schema_name() -> String
source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
source§fn json_schema(gen: &mut SchemaGenerator) -> Schema
fn json_schema(gen: &mut SchemaGenerator) -> Schema
source§fn is_referenceable() -> bool
fn is_referenceable() -> bool
$ref
keyword. Read moresource§impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
source§fn 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,
source§impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.source§fn serialize_as<S>(
source: &Time03Duration,
serializer: S,
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &Time03Duration,
serializer: S,
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
source§fn 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,
source§impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.source§fn serialize_as<S>(
source: &Time03Duration,
serializer: S,
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &Time03Duration,
serializer: S,
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<TimeDelta> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4
only.
impl<STRICTNESS> SerializeAs<TimeDelta> for DurationSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
chrono_0_4
only.source§fn 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,
source§impl<STRICTNESS> SerializeAs<TimeDelta> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4
only.
impl<STRICTNESS> SerializeAs<TimeDelta> for DurationSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
chrono_0_4
only.