headers/util/
seconds.rs

1use std::fmt;
2use std::time::Duration;
3
4use util::IterExt;
5use HeaderValue;
6
7#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub(crate) struct Seconds(Duration);
9
10impl Seconds {
11    pub(crate) fn from_val(val: &HeaderValue) -> Option<Self> {
12        let secs = val.to_str().ok()?.parse().ok()?;
13
14        Some(Self::from_secs(secs))
15    }
16
17    pub(crate) fn from_secs(secs: u64) -> Self {
18        Self::from(Duration::from_secs(secs))
19    }
20
21    pub(crate) fn as_u64(&self) -> u64 {
22        self.0.as_secs()
23    }
24}
25
26impl super::TryFromValues for Seconds {
27    fn try_from_values<'i, I>(values: &mut I) -> Result<Self, ::Error>
28    where
29        I: Iterator<Item = &'i HeaderValue>,
30    {
31        values
32            .just_one()
33            .and_then(Seconds::from_val)
34            .ok_or_else(::Error::invalid)
35    }
36}
37
38impl<'a> From<&'a Seconds> for HeaderValue {
39    fn from(secs: &'a Seconds) -> HeaderValue {
40        secs.0.as_secs().into()
41    }
42}
43
44impl From<Duration> for Seconds {
45    fn from(dur: Duration) -> Seconds {
46        debug_assert!(dur.subsec_nanos() == 0);
47        Seconds(dur)
48    }
49}
50
51impl From<Seconds> for Duration {
52    fn from(secs: Seconds) -> Duration {
53        secs.0
54    }
55}
56
57impl fmt::Debug for Seconds {
58    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
59        write!(f, "{}s", self.0.as_secs())
60    }
61}
62
63impl fmt::Display for Seconds {
64    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65        fmt::Display::fmt(&self.0.as_secs(), f)
66    }
67}