diff options
Diffstat (limited to 'src/response.rs')
-rw-r--r-- | src/response.rs | 72 |
1 files changed, 31 insertions, 41 deletions
diff --git a/src/response.rs b/src/response.rs index 39e6c98..9c92e4c 100644 --- a/src/response.rs +++ b/src/response.rs @@ -1,60 +1,50 @@ -//! Provides the [`Response`] convenience wrapper. +//! Provides the [`SputnikBuilder`] trait. use cookie::Cookie; -use hyper::{StatusCode, header::{self, HeaderName, HeaderValue}}; +use hyper::{StatusCode, header::{self, HeaderValue}, http}; use time::{Duration, OffsetDateTime}; +use hyper::http::response::Builder; -type HyperResponse = hyper::Response<hyper::Body>; +pub trait SputnikBuilder { + /// Adds a Set-Cookie header. + fn set_cookie(&mut self, cookie: Cookie); -/// Convenience wrapper around [`hyper::Response`]. -pub struct Response { - res: HyperResponse -} + /// Adds a Set-Cookie header to delete a cookie. + fn delete_cookie(&mut self, name: &str); -impl Into<HyperResponse> for Response { - fn into(self) -> HyperResponse { - self.res - } + /// Sets the Content-Type. + fn content_type(self, mime: mime::Mime) -> Builder; } -impl Response { - pub fn new() -> Self { - Response{res: HyperResponse::new(hyper::Body::empty())} - } - - pub fn status(&mut self) -> &mut StatusCode { - self.res.status_mut() - } - - pub fn body(&mut self) -> &mut hyper::Body { - self.res.body_mut() - } - pub fn headers(&mut self) -> &mut hyper::HeaderMap<header::HeaderValue> { - self.res.headers_mut() - } +pub fn redirect(location: &str, code: StatusCode) -> Builder { + Builder::new().status(code).header(header::LOCATION, location) +} - pub fn set_header<S: AsRef<str>>(&mut self, header: HeaderName, value: S) { - self.res.headers_mut().insert(header, HeaderValue::from_str(value.as_ref()).unwrap()); +impl SputnikBuilder for Builder { + fn set_cookie(&mut self, cookie: Cookie) { + self.headers_mut().unwrap().insert(header::SET_COOKIE, HeaderValue::from_str(&cookie.encoded().to_string()).unwrap()); } - pub fn set_content_type(&mut self, mime: mime::Mime) { - self.res.headers_mut().insert(header::CONTENT_TYPE, mime.to_string().parse().unwrap()); + fn delete_cookie(&mut self, name: &str) { + let mut cookie = Cookie::new(name, ""); + cookie.set_max_age(Duration::seconds(0)); + cookie.set_expires(OffsetDateTime::now_utc() - Duration::days(365)); + self.set_cookie(cookie); } - pub fn redirect<S: AsRef<str>>(&mut self, location: S, code: StatusCode) { - *self.res.status_mut() = code; - self.set_header(header::LOCATION, location); + fn content_type(self, mime: mime::Mime) -> Self { + self.header(header::CONTENT_TYPE, mime.to_string()) } +} - pub fn set_cookie(&mut self, cookie: Cookie) { - self.res.headers_mut().append(header::SET_COOKIE, cookie.encoded().to_string().parse().unwrap()); - } +pub trait EmptyBuilder<B> { + /// Consume the builder with an empty body. + fn empty(self) -> http::Result<http::response::Response<B>>; +} - pub fn delete_cookie(&mut self, name: &str) { - let mut cookie = Cookie::new(name, ""); - cookie.set_max_age(Duration::seconds(0)); - cookie.set_expires(OffsetDateTime::now_utc() - Duration::days(365)); - self.set_cookie(cookie); +impl EmptyBuilder<hyper::Body> for Builder { + fn empty(self) -> http::Result<http::response::Response<hyper::Body>> { + self.body(hyper::Body::empty()) } }
\ No newline at end of file |