2016-08-08 10:10:23 +00:00
|
|
|
use std::fmt::Debug;
|
2016-10-04 00:09:13 +00:00
|
|
|
|
|
|
|
use request::Request;
|
|
|
|
use http::{ContentType, Method, Cookies};
|
2016-08-08 10:10:23 +00:00
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
pub trait FromRequest<'r>: Sized {
|
2016-08-08 10:10:23 +00:00
|
|
|
type Error: Debug;
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error>;
|
2016-08-08 10:10:23 +00:00
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r> FromRequest<'r> for &'r Request {
|
2016-08-08 10:10:23 +00:00
|
|
|
type Error = ();
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-08-08 10:10:23 +00:00
|
|
|
Ok(request)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r> FromRequest<'r> for Method {
|
2016-08-27 12:10:29 +00:00
|
|
|
type Error = ();
|
2016-08-08 10:10:23 +00:00
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-08-08 10:10:23 +00:00
|
|
|
Ok(request.method)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r> FromRequest<'r> for &'r Cookies {
|
2016-08-27 12:10:29 +00:00
|
|
|
type Error = ();
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-09-12 01:57:04 +00:00
|
|
|
Ok(request.cookies())
|
2016-08-08 10:48:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r> FromRequest<'r> for ContentType {
|
2016-08-27 12:10:29 +00:00
|
|
|
type Error = ();
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-08-27 12:10:29 +00:00
|
|
|
Ok(request.content_type())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r, T: FromRequest<'r>> FromRequest<'r> for Option<T> {
|
2016-08-08 10:10:23 +00:00
|
|
|
type Error = ();
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-08-08 10:10:23 +00:00
|
|
|
let opt = match T::from_request(request) {
|
|
|
|
Ok(v) => Some(v),
|
2016-09-30 22:20:11 +00:00
|
|
|
Err(_) => None,
|
2016-08-08 10:10:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
Ok(opt)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
impl<'r, T: FromRequest<'r>> FromRequest<'r> for Result<T, T::Error> {
|
2016-08-08 10:10:23 +00:00
|
|
|
type Error = ();
|
|
|
|
|
2016-10-08 06:20:49 +00:00
|
|
|
fn from_request(request: &'r Request) -> Result<Self, Self::Error> {
|
2016-08-08 10:10:23 +00:00
|
|
|
Ok(T::from_request(request))
|
|
|
|
}
|
|
|
|
}
|