use request::*; use method::Method; use std::fmt::Debug; 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 = &'static str; fn from_request(request: &'r Request<'c>) -> Result { Ok(request.method) } } impl<'r, 'c> FromRequest<'r, 'c> for Cookies { type Error = &'static str; fn from_request(request: &'r Request<'c>) -> Result { match request.headers.get::() { // TODO: What to do about key? Some(cookie) => Ok(cookie.to_cookie_jar(&[])), None => Ok(Cookies::new(&[])) } } } 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)) } }