Skip to content

Commit 49dd603

Browse files
authored
Merge pull request #364 from pbzweihander/status-for-crate-error
Implement `Status` for `Result<T, http_types::Error>`
2 parents b84a7a6 + 97acd4d commit 49dd603

File tree

4 files changed

+46
-4
lines changed

4 files changed

+46
-4
lines changed

src/cache/age.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl Age {
6262
// entry. We want the last entry.
6363
let header = headers.iter().last().unwrap();
6464

65-
let num: u64 = header.as_str().parse().status(400)?;
65+
let num: u64 = header.as_str().parse::<u64>().status(400)?;
6666
let dur = Duration::from_secs_f64(num as f64);
6767

6868
Ok(Some(Self { dur }))

src/cache/cache_control/cache_directive.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ impl CacheDirective {
9494

9595
let mut get_dur = || -> crate::Result<Duration> {
9696
let dur = parts.next().status(400)?;
97-
let dur: u64 = dur.parse().status(400)?;
97+
let dur: u64 = dur.parse::<u64>().status(400)?;
9898
Ok(Duration::new(dur, 0))
9999
};
100100

@@ -112,7 +112,7 @@ impl CacheDirective {
112112
"max-age" => Some(MaxAge(get_dur()?)),
113113
"max-stale" => match parts.next() {
114114
Some(secs) => {
115-
let dur: u64 = secs.parse().status(400)?;
115+
let dur: u64 = secs.parse::<u64>().status(400)?;
116116
Some(MaxStale(Some(Duration::new(dur, 0))))
117117
}
118118
None => Some(MaxStale(None)),

src/content/content_length.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl ContentLength {
4747
// If we successfully parsed the header then there's always at least one
4848
// entry. We want the last entry.
4949
let value = headers.iter().last().unwrap();
50-
let length = value.as_str().trim().parse().status(400)?;
50+
let length = value.as_str().trim().parse::<u64>().status(400)?;
5151
Ok(Some(Self { length }))
5252
}
5353

src/status.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,48 @@ where
7171
}
7272
}
7373

74+
impl<T> Status<T, Error> for Result<T, Error> {
75+
/// Wrap the error value with an additional status code.
76+
///
77+
/// # Panics
78+
///
79+
/// Panics if [`Status`][status] is not a valid [`StatusCode`][statuscode].
80+
///
81+
/// [status]: crate::Status
82+
/// [statuscode]: crate::StatusCode
83+
fn status<S>(self, status: S) -> Result<T, Error>
84+
where
85+
S: TryInto<StatusCode>,
86+
S::Error: Debug,
87+
{
88+
self.map_err(|mut error| {
89+
error.set_status(status);
90+
error
91+
})
92+
}
93+
94+
/// Wrap the error value with an additional status code that is evaluated
95+
/// lazily only once an error does occur.
96+
///
97+
/// # Panics
98+
///
99+
/// Panics if [`Status`][status] is not a valid [`StatusCode`][statuscode].
100+
///
101+
/// [status]: crate::Status
102+
/// [statuscode]: crate::StatusCode
103+
fn with_status<S, F>(self, f: F) -> Result<T, Error>
104+
where
105+
S: TryInto<StatusCode>,
106+
S::Error: Debug,
107+
F: FnOnce() -> S,
108+
{
109+
self.map_err(|mut error| {
110+
error.set_status(f());
111+
error
112+
})
113+
}
114+
}
115+
74116
impl<T> Status<T, Infallible> for Option<T> {
75117
/// Wrap the error value with an additional status code.
76118
///

0 commit comments

Comments
 (0)