1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use hyper::{header, http::Error, Body, Response as HyperResponse, StatusCode}; use mime::Mime; use std::borrow::Cow; pub trait Response { fn respond(self) -> Result<HyperResponse<Body>, Error>; } impl Response for HyperResponse<Body> { fn respond(self) -> Result<HyperResponse<Body>, Error> { Ok(self) } } impl<B> Response for (Mime, B) where B: Into<Body>, { fn respond(self) -> Result<HyperResponse<Body>, Error> { (StatusCode::OK, self.0, self.1).respond() } } impl<B> Response for (StatusCode, Mime, B) where B: Into<Body>, { fn respond(self) -> Result<HyperResponse<Body>, Error> { HyperResponse::builder() .status(self.0) .header(header::CONTENT_TYPE, self.1.as_ref()) .body(self.2.into()) } } macro_rules! plain_response { ($type:ty) => { impl Response for $type { fn respond(self) -> Result<HyperResponse<Body>, Error> { (StatusCode::OK, mime::TEXT_PLAIN, self).respond() } } }; } plain_response!(&'static str); plain_response!(Cow<'static, str>); plain_response!(String);