1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use std::time::Duration;
use crate::util::Seconds;
/// `Age` header, defined in [RFC7234](https://tools.ietf.org/html/rfc7234#section-5.1)
///
/// The "Age" header field conveys the sender's estimate of the amount of
/// time since the response was generated or successfully validated at
/// the origin server. Age values are calculated as specified in
/// [Section 4.2.3](https://tools.ietf.org/html/rfc7234#section-4.2.3).
///
/// ## ABNF
///
/// ```text
/// Age = delta-seconds
/// ```
///
/// The Age field-value is a non-negative integer, representing time in
/// seconds (see [Section 1.2.1](https://tools.ietf.org/html/rfc7234#section-1.2.1)).
///
/// The presence of an Age header field implies that the response was not
/// generated or validated by the origin server for this request.
/// However, lack of an Age header field does not imply the origin was
/// contacted, since the response might have been received from an
/// HTTP/1.0 cache that does not implement Age.
///
/// ## Example values
///
/// * `3600`
///
/// # Example
///
/// ```
/// use rama_http_headers::Age;
///
/// let len = Age::from_seconds(60);
/// ```
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Age(Seconds);
derive_header! {
Age(_),
name: AGE
}
impl Age {
#[must_use]
#[inline(always)]
pub fn from_seconds(secs: u64) -> Self {
Self(Seconds::new(secs))
}
#[must_use]
#[inline(always)]
pub fn try_from_duration(dur: Duration) -> Option<Self> {
Seconds::try_from_duration(dur).map(Self)
}
#[must_use]
#[inline(always)]
pub fn from_duration_rounded(dur: Duration) -> Self {
Self(Seconds::from_duration_rounded(dur))
}
#[must_use]
pub fn as_secs(self) -> u64 {
self.0.into()
}
}
impl From<Age> for Duration {
fn from(age: Age) -> Self {
age.0.into()
}
}