2016-08-08 10:10:23 +00:00
|
|
|
use request::*;
|
|
|
|
use method::Method;
|
|
|
|
use std::fmt::Debug;
|
2016-08-27 12:10:29 +00:00
|
|
|
use content_type::ContentType;
|
2016-08-08 10:10:23 +00:00
|
|
|
|
|
|
|
pub trait FromRequest<'r, 'c>: Sized {
|
|
|
|
type Error: Debug;
|
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error>;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'r, 'c> FromRequest<'r, 'c> for &'r Request<'c> {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
|
|
|
Ok(request)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'r, 'c> FromRequest<'r, 'c> for Method {
|
2016-08-27 12:10:29 +00:00
|
|
|
type Error = ();
|
2016-08-08 10:10:23 +00:00
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
|
|
|
Ok(request.method)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-08 10:48:00 +00:00
|
|
|
impl<'r, 'c> FromRequest<'r, 'c> for Cookies {
|
2016-08-27 12:10:29 +00:00
|
|
|
type Error = ();
|
2016-08-08 10:48:00 +00:00
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
2016-08-26 08:55:11 +00:00
|
|
|
match request.headers().get::<HyperCookie>() {
|
2016-08-08 10:48:00 +00:00
|
|
|
// TODO: What to do about key?
|
|
|
|
Some(cookie) => Ok(cookie.to_cookie_jar(&[])),
|
|
|
|
None => Ok(Cookies::new(&[]))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-27 12:10:29 +00:00
|
|
|
impl<'r, 'c> FromRequest<'r, 'c> for ContentType {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
|
|
|
Ok(request.content_type())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-08 10:10:23 +00:00
|
|
|
impl<'r, 'c, T: FromRequest<'r, 'c>> FromRequest<'r, 'c> for Option<T> {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
|
|
|
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<T, T::Error> {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
|
|
|
|
Ok(T::from_request(request))
|
|
|
|
}
|
|
|
|
}
|