pub struct DurationSeconds<FORMAT: Format = u64, STRICTNESS: Strictness = Strict>(/* private fields */);Expand description
De/Serialize Durations as number of seconds.
De/serialize durations as number of seconds with sub-second precision.
Sub-second 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.
Serialization of integers will round the duration to the nearest value.
This type also supports chrono::Duration with the chrono_0_4-feature flag.
This type also supports time::Duration with the time_0_3-feature flag.
This table lists the available FORMATs for the different duration types.
The FORMAT specifier defaults to u64/f64.
| Duration Type | Converter | Available FORMATs |
|---|---|---|
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 = "DurationSeconds<u64>")]
d_u64: Duration,
#[serde_as(as = "DurationSeconds<f64>")]
d_f64: Duration,
#[serde_as(as = "DurationSeconds<String>")]
d_string: Duration,
}
// Serialization
// See how the values get rounded, since subsecond precision is not allowed.
let d = Durations {
d_u64: Duration::new(12345, 0), // Create from seconds and nanoseconds
d_f64: Duration::new(12345, 500_000_000),
d_string: Duration::new(12345, 999_999_999),
};
// Observe the different data types
let expected = json!({
"d_u64": 12345,
"d_f64": 12346.0,
"d_string": "12346",
});
assert_eq!(expected, serde_json::to_value(d).unwrap());
// Deserialization works too
// Subsecond precision in numbers will be rounded away
let json = json!({
"d_u64": 12345,
"d_f64": 12345.5,
"d_string": "12346",
});
let expected = Durations {
d_u64: Duration::new(12345, 0), // Create from seconds and nanoseconds
d_f64: Duration::new(12346, 0),
d_string: Duration::new(12346, 0),
};
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 = "DurationSeconds<i64>")]
d_i64: Duration,
#[serde_as(as = "DurationSeconds<f64>")]
d_f64: Duration,
#[serde_as(as = "DurationSeconds<String>")]
d_string: Duration,
}
// Serialization
// See how the values get rounded, since subsecond precision is not allowed.
let d = Durations {
d_i64: Duration::seconds(-12345),
d_f64: Duration::seconds(-12345) + Duration::milliseconds(500),
d_string: Duration::seconds(12345) + Duration::nanoseconds(999_999_999),
};
// Observe the different data types
let expected = json!({
"d_i64": -12345,
"d_f64": -12345.0,
"d_string": "12346",
});
assert_eq!(expected, serde_json::to_value(d).unwrap());
// Deserialization works too
// Subsecond precision in numbers will be rounded away
let json = json!({
"d_i64": -12345,
"d_f64": -12345.5,
"d_string": "12346",
});
let expected = Durations {
d_i64: Duration::seconds(-12345),
d_f64: Duration::seconds(-12346),
d_string: Duration::seconds(12346),
};
assert_eq!(expected, serde_json::from_value(json).unwrap());Trait Implementations§
Source§impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<u64, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<u64, 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 DurationSeconds<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature chrono_0_4 only.
impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSeconds<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, FORMAT> DeserializeAs<'de, Duration> for DurationSeconds<FORMAT, Flexible>where
FORMAT: Format,
impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSeconds<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 DurationSeconds<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature time_0_3 only.
impl<'de, FORMAT> DeserializeAs<'de, Duration> for DurationSeconds<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 DurationSeconds<String, Strict>
Available on crate feature chrono_0_4 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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<'de> DeserializeAs<'de, Duration> for DurationSeconds<String, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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 DurationSeconds<String, Strict>
Available on crate feature time_0_3 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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 DurationSeconds<f64, Strict>
Available on crate feature chrono_0_4 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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> DeserializeAs<'de, Duration> for DurationSeconds<f64, Strict>
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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> DeserializeAs<'de, Duration> for DurationSeconds<f64, Strict>
Available on crate feature time_0_3 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<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, Duration> for DurationSeconds<i64, Strict>
Available on crate feature chrono_0_4 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<i64, 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> DeserializeAs<'de, Duration> for DurationSeconds<i64, Strict>
Available on crate feature time_0_3 only.
impl<'de> DeserializeAs<'de, Duration> for DurationSeconds<i64, 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<T, F> JsonSchemaAs<T> for DurationSeconds<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_8 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<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 DurationSeconds<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_9 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_0_9 only.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 inline_schema() -> bool
fn inline_schema() -> bool
$ref
keyword. Read moreSource§impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_1 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Strict>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_1 only.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 inline_schema() -> bool
fn inline_schema() -> bool
$ref
keyword. Read moreSource§impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_8 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<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<T, F> JsonSchemaAs<T> for DurationSeconds<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_0_9 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_0_9 only.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 inline_schema() -> bool
fn inline_schema() -> bool
$ref
keyword. Read moreSource§impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
Available on crate feature schemars_1 only.
impl<T, F> JsonSchemaAs<T> for DurationSeconds<F, Flexible>where
T: TimespanSchemaTarget<F>,
F: Format + JsonSchema,
schemars_1 only.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 inline_schema() -> bool
fn inline_schema() -> bool
$ref
keyword. Read moreSource§impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<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<Duration> for DurationSeconds<String, STRICTNESS>where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<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 DurationSeconds<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<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 DurationSeconds<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<f64, 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<Duration> for DurationSeconds<f64, STRICTNESS>where
STRICTNESS: Strictness,
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<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 DurationSeconds<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<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<Duration> for DurationSeconds<i64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<i64, 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<Duration> for DurationSeconds<i64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3 only.
impl<STRICTNESS> SerializeAs<Duration> for DurationSeconds<i64, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3 only.