use std::time::Duration;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use super::duration_payload_visitor::DurationPayloadVisitor;
#[derive(Serialize)]
pub(in crate::wire) struct DurationPayload {
pub(in crate::wire) secs: u64,
pub(in crate::wire) nanos: u32,
}
impl<'de> Deserialize<'de> for DurationPayload {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let allow_sequence = !deserializer.is_human_readable();
deserializer.deserialize_struct(
"DurationPayload",
&["secs", "nanos"],
DurationPayloadVisitor::new(allow_sequence),
)
}
}
impl From<&Duration> for DurationPayload {
#[inline]
fn from(value: &Duration) -> Self {
Self {
secs: value.as_secs(),
nanos: value.subsec_nanos(),
}
}
}
impl TryFrom<DurationPayload> for Duration {
type Error = &'static str;
#[inline]
fn try_from(value: DurationPayload) -> Result<Self, Self::Error> {
if value.nanos >= 1_000_000_000 {
return Err("duration nanoseconds must be less than 1000000000");
}
Ok(Self::new(value.secs, value.nanos))
}
}