use std::hash::{Hash, Hasher};
use std::collections::hash_map::DefaultHasher;
use request::Request;
use response::{Responder, Response};
use http::hyper::header;
use http::Status;
#[derive(Debug, Clone, PartialEq)]
pub struct Created<R>(pub String, pub Option<R>);
impl<'r, R: Responder<'r>> Responder<'r> for Created<R> {
default fn respond_to(self, req: &Request) -> Result<Response<'r>, Status> {
let mut build = Response::build();
if let Some(responder) = self.1 {
build.merge(responder.respond_to(req)?);
}
build.status(Status::Created).header(header::Location(self.0)).ok()
}
}
impl<'r, R: Responder<'r> + Hash> Responder<'r> for Created<R> {
fn respond_to(self, req: &Request) -> Result<Response<'r>, Status> {
let mut hasher = DefaultHasher::default();
let mut build = Response::build();
if let Some(responder) = self.1 {
responder.hash(&mut hasher);
let hash = hasher.finish().to_string();
build.merge(responder.respond_to(req)?);
build.header(header::ETag(header::EntityTag::strong(hash)));
}
build.status(Status::Created).header(header::Location(self.0)).ok()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Accepted<R>(pub Option<R>);
impl<'r, R: Responder<'r>> Responder<'r> for Accepted<R> {
fn respond_to(self, req: &Request) -> Result<Response<'r>, Status> {
let mut build = Response::build();
if let Some(responder) = self.0 {
build.merge(responder.respond_to(req)?);
}
build.status(Status::Accepted).ok()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct NoContent;
impl<'r> Responder<'r> for NoContent {
fn respond_to(self, _: &Request) -> Result<Response<'r>, Status> {
Response::build().status(Status::NoContent).ok()
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Reset;
impl Responder<'static> for Reset {
fn respond_to(self, _: &Request) -> Result<Response<'static>, Status> {
Response::build().status(Status::ResetContent).ok()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct NotFound<R>(pub R);
impl<'r, R: Responder<'r>> Responder<'r> for NotFound<R> {
fn respond_to(self, req: &Request) -> Result<Response<'r>, Status> {
Response::build_from(self.0.respond_to(req)?)
.status(Status::NotFound)
.ok()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Custom<R>(pub Status, pub R);
impl<'r, R: Responder<'r>> Responder<'r> for Custom<R> {
fn respond_to(self, req: &Request) -> Result<Response<'r>, Status> {
Response::build_from(self.1.respond_to(req)?)
.status(self.0)
.ok()
}
}