wasm_framework/
httpdate.rs

1use std::fmt;
2
3/// Time in UTC, with conversions to/from u64 and rfc2822
4#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
5pub struct HttpDate(u64);
6
7/// Convert HttpDate to printable string in rfc2822 format
8impl fmt::Display for HttpDate {
9    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10        use chrono::{DateTime, NaiveDateTime, Utc};
11
12        let dt = DateTime::<Utc>::from_utc(NaiveDateTime::from_timestamp(self.0 as i64, 0), Utc);
13        fmt::Display::fmt(&dt.to_rfc2822(), f)
14    }
15}
16
17/// Convert u64 timestamp (seconds since EPOCH in UTC) to HttpDate
18impl From<u64> for HttpDate {
19    fn from(utc_sec: u64) -> HttpDate {
20        HttpDate(utc_sec)
21    }
22}
23
24/// Convert i64 timestamp (seconds since EPOCH in UTC) to HttpDate
25impl From<i64> for HttpDate {
26    fn from(utc_sec: i64) -> HttpDate {
27        HttpDate(utc_sec as u64)
28    }
29}
30
31impl std::str::FromStr for HttpDate {
32    type Err = chrono::format::ParseError;
33
34    /// Parse string to HttpDate
35    fn from_str(s: &str) -> Result<HttpDate, Self::Err> {
36        let utc_sec = chrono::DateTime::parse_from_rfc2822(s).map(|dt| dt.timestamp() as u64)?;
37        Ok(HttpDate(utc_sec))
38    }
39}
40
41impl HttpDate {
42    /// Convert HttpDate to i64 timestamp (seconds since EPOCH in UTC)
43    pub fn timestamp(&self) -> u64 {
44        self.0
45    }
46}