use std::fmt::Debug; use outcome; use request::Request; use outcome::Outcome::*; use http::{StatusCode, ContentType, Method, Cookies}; /// Type alias for the `Outcome` of a `FromRequest` conversion. pub type Outcome = outcome::Outcome; pub trait FromRequest<'r>: Sized { type Error: Debug; fn from_request(request: &'r Request) -> Outcome; } impl<'r> FromRequest<'r> for &'r Request { type Error = (); fn from_request(request: &'r Request) -> Outcome { Success(request) } } impl<'r> FromRequest<'r> for Method { type Error = (); fn from_request(request: &'r Request) -> Outcome { Success(request.method) } } impl<'r> FromRequest<'r> for &'r Cookies { type Error = (); fn from_request(request: &'r Request) -> Outcome { Success(request.cookies()) } } impl<'r> FromRequest<'r> for ContentType { type Error = (); fn from_request(request: &'r Request) -> Outcome { Success(request.content_type()) } } impl<'r, T: FromRequest<'r>> FromRequest<'r> for Result { type Error = (); fn from_request(request: &'r Request) -> Outcome { match T::from_request(request) { Success(val) => Success(Ok(val)), Failure((_, e)) => Success(Err(e)), Forward(_) => Forward(()), } } } impl<'r, T: FromRequest<'r>> FromRequest<'r> for Option { type Error = (); fn from_request(request: &'r Request) -> Outcome { match T::from_request(request) { Success(val) => Success(Some(val)), Failure(_) => Success(None), Forward(_) => Success(None), } } }