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.
|
// entry. We want the last entry.
|
||||||
let header = headers.iter().last().unwrap();
|
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);
|
let dur = Duration::from_secs_f64(num as f64);
|
||||||
|
|
||||||
Ok(Some(Self { dur }))
|
Ok(Some(Self { dur }))
|
||||||
|
|
|
@ -94,7 +94,7 @@ impl CacheDirective {
|
||||||
|
|
||||||
let mut get_dur = || -> crate::Result<Duration> {
|
let mut get_dur = || -> crate::Result<Duration> {
|
||||||
let dur = parts.next().status(400)?;
|
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))
|
Ok(Duration::new(dur, 0))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ impl CacheDirective {
|
||||||
"max-age" => Some(MaxAge(get_dur()?)),
|
"max-age" => Some(MaxAge(get_dur()?)),
|
||||||
"max-stale" => match parts.next() {
|
"max-stale" => match parts.next() {
|
||||||
Some(secs) => {
|
Some(secs) => {
|
||||||
let dur: u64 = secs.parse().status(400)?;
|
let dur: u64 = secs.parse::<u64>().status(400)?;
|
||||||
Some(MaxStale(Some(Duration::new(dur, 0))))
|
Some(MaxStale(Some(Duration::new(dur, 0))))
|
||||||
}
|
}
|
||||||
None => Some(MaxStale(None)),
|
None => Some(MaxStale(None)),
|
||||||
|
|
|
@ -47,7 +47,7 @@ impl ContentLength {
|
||||||
// If we successfully parsed the header then there's always at least one
|
// If we successfully parsed the header then there's always at least one
|
||||||
// entry. We want the last entry.
|
// entry. We want the last entry.
|
||||||
let value = headers.iter().last().unwrap();
|
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 }))
|
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> {
|
impl<T> Status<T, Infallible> for Option<T> {
|
||||||
/// Wrap the error value with an additional status code.
|
/// Wrap the error value with an additional status code.
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in New Issue