use std::io::{File, MemReader};
use std::path::Path;
use modifier::Modifier;
use hyper::mime::Mime;
use {status, headers, Response, Url};
impl Modifier<Response> for Mime {
#[inline]
fn modify(self, res: &mut Response) {
res.headers.set(headers::ContentType(self))
}
}
impl Modifier<Response> for Box<Reader + Send> {
#[inline]
fn modify(self, res: &mut Response) {
res.body = Some(self);
}
}
impl Modifier<Response> for String {
#[inline]
fn modify(self, res: &mut Response) {
self.into_bytes().modify(res);
}
}
impl Modifier<Response> for Vec<u8> {
#[inline]
fn modify(self, res: &mut Response) {
res.headers.set(headers::ContentLength(self.len() as u64));
res.body = Some(Box::new(MemReader::new(self)) as Box<Reader + Send>);
}
}
impl<'a> Modifier<Response> for &'a str {
#[inline]
fn modify(self, res: &mut Response) {
self.to_string().modify(res);
}
}
impl<'a> Modifier<Response> for &'a [u8] {
#[inline]
fn modify(self, res: &mut Response) {
self.to_vec().modify(res);
}
}
impl Modifier<Response> for File {
#[inline]
fn modify(self, res: &mut Response) {
res.body = Some(Box::new(self) as Box<Reader + Send>);
}
}
impl Modifier<Response> for Path {
fn modify(self, res: &mut Response) {
File::open(&self)
.ok().expect(format!("No such file: {}", self.display()).as_slice())
.modify(res);
}
}
impl Modifier<Response> for status::Status {
fn modify(self, res: &mut Response) {
res.status = Some(self);
}
}
pub struct Redirect(pub Url);
impl Modifier<Response> for Redirect {
fn modify(self, res: &mut Response) {
let Redirect(url) = self;
res.headers.set(headers::Location(url.to_string()));
}
}