mirror of https://github.com/http-rs/http-types
Merge pull request #364 from pbzweihander/status-for-crate-error
Implement `Status` for `Result<T, http_types::Error>`
This commit is contained in:
commit
49dd60324d
|
@ -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 }))
|
||||
|
|
|
@ -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)),
|
||||
|
|
|
@ -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 }))
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue