npsd/payload/std/
time.rs

1use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
2
3use super::{Error, Middleware, Payload, IntoPayload, FromPayload};
4
5impl<C> IntoPayload<C>  for Duration {
6    fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
7        let secs = self.as_secs();
8        let nanos = self.subsec_nanos();
9
10        next.into_payload(&(secs, nanos), ctx)
11    }
12}
13
14impl<'a, C> FromPayload<'a, C> for Duration {
15    fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
16        let (secs, nanos): (u64, u32) = next.from_payload(ctx)?;
17
18        Ok(Duration::new(secs, nanos))
19    }
20}
21
22impl<'a, C> Payload<'a, C> for Duration {}
23
24impl<C> IntoPayload<C>  for Instant {
25    fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
26        match SystemTime::now().duration_since(UNIX_EPOCH) {
27            Ok(time) => next.into_payload(&time, ctx),
28            Err(error) => Err(Error::Time(error.to_string())),
29        }
30    }
31}
32
33impl<C> IntoPayload<C>  for SystemTime {
34    fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
35        match SystemTime::now().duration_since(UNIX_EPOCH) {
36            Ok(time) => next.into_payload(&time, ctx),
37            Err(error) => Err(Error::Time(error.to_string())),
38        }
39    }
40}
41
42impl<'a, C> FromPayload<'a, C> for SystemTime {
43    #[inline]
44    fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
45        Ok(UNIX_EPOCH + next.from_payload::<C, Duration>(ctx)?)
46    }
47}
48
49impl<'a, C> Payload<'a, C> for SystemTime {}