use std::fmt::Debug; use request::Request; use http::{ContentType, Method, Cookies}; pub trait FromRequest<'r>: Sized { type Error: Debug; fn from_request(request: &'r Request) -> Result; } impl<'r> FromRequest<'r> for &'r Request { type Error = (); fn from_request(request: &'r Request) -> Result { Ok(request) } } impl<'r> FromRequest<'r> for Method { type Error = (); fn from_request(request: &'r Request) -> Result { Ok(request.method) } } impl<'r> FromRequest<'r> for &'r Cookies { type Error = (); fn from_request(request: &'r Request) -> Result { Ok(request.cookies()) } } impl<'r> FromRequest<'r> for ContentType { type Error = (); fn from_request(request: &'r Request) -> Result { Ok(request.content_type()) } } impl<'r, T: FromRequest<'r>> FromRequest<'r> for Option { type Error = (); fn from_request(request: &'r Request) -> Result { let opt = match T::from_request(request) { Ok(v) => Some(v), Err(_) => None, }; Ok(opt) } } impl<'r, T: FromRequest<'r>> FromRequest<'r> for Result { type Error = (); fn from_request(request: &'r Request) -> Result { Ok(T::from_request(request)) } }