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