Merge pull request #364 from pbzweihander/status-for-crate-error

Implement `Status` for `Result<T, http_types::Error>`
This commit is contained in:
Jeremiah Senkpiel 2022-01-27 10:16:17 -08:00 committed by GitHub
commit 49dd60324d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 4 deletions

2
src/cache/age.rs vendored
View File

@ -62,7 +62,7 @@ impl Age {
// entry. We want the last entry.
let header = headers.iter().last().unwrap();
let num: u64 = header.as_str().parse().status(400)?;
let num: u64 = header.as_str().parse::<u64>().status(400)?;
let dur = Duration::from_secs_f64(num as f64);
Ok(Some(Self { dur }))

View File

@ -94,7 +94,7 @@ impl CacheDirective {
let mut get_dur = || -> crate::Result<Duration> {
let dur = parts.next().status(400)?;
let dur: u64 = dur.parse().status(400)?;
let dur: u64 = dur.parse::<u64>().status(400)?;
Ok(Duration::new(dur, 0))
};
@ -112,7 +112,7 @@ impl CacheDirective {
"max-age" => Some(MaxAge(get_dur()?)),
"max-stale" => match parts.next() {
Some(secs) => {
let dur: u64 = secs.parse().status(400)?;
let dur: u64 = secs.parse::<u64>().status(400)?;
Some(MaxStale(Some(Duration::new(dur, 0))))
}
None => Some(MaxStale(None)),

View File

@ -47,7 +47,7 @@ impl ContentLength {
// If we successfully parsed the header then there's always at least one
// entry. We want the last entry.
let value = headers.iter().last().unwrap();
let length = value.as_str().trim().parse().status(400)?;
let length = value.as_str().trim().parse::<u64>().status(400)?;
Ok(Some(Self { length }))
}

View File

@ -71,6 +71,48 @@ where
}
}
impl<T> Status<T, Error> for Result<T, Error> {
/// Wrap the error value with an additional status code.
///
/// # Panics
///
/// Panics if [`Status`][status] is not a valid [`StatusCode`][statuscode].
///
/// [status]: crate::Status
/// [statuscode]: crate::StatusCode
fn status<S>(self, status: S) -> Result<T, Error>
where
S: TryInto<StatusCode>,
S::Error: Debug,
{
self.map_err(|mut error| {
error.set_status(status);
error
})
}
/// Wrap the error value with an additional status code that is evaluated
/// lazily only once an error does occur.
///
/// # Panics
///
/// Panics if [`Status`][status] is not a valid [`StatusCode`][statuscode].
///
/// [status]: crate::Status
/// [statuscode]: crate::StatusCode
fn with_status<S, F>(self, f: F) -> Result<T, Error>
where
S: TryInto<StatusCode>,
S::Error: Debug,
F: FnOnce() -> S,
{
self.map_err(|mut error| {
error.set_status(f());
error
})
}
}
impl<T> Status<T, Infallible> for Option<T> {
/// Wrap the error value with an additional status code.
///