diff options
| author | Zeyla Hellyer <[email protected]> | 2018-08-05 12:01:54 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2018-08-05 12:01:54 -0700 |
| commit | 0d553630c1a9da216e42e7c0a9bedaccfedf678d (patch) | |
| tree | 5156a26ea9d97b9e962458315eda40854437ce2b /src/http/request.rs | |
| parent | [http] Abstract out routing methods and paths (diff) | |
| download | serenity-0d553630c1a9da216e42e7c0a9bedaccfedf678d.tar.xz serenity-0d553630c1a9da216e42e7c0a9bedaccfedf678d.zip | |
Make http::fire, http::request public
Diffstat (limited to 'src/http/request.rs')
| -rw-r--r-- | src/http/request.rs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/http/request.rs b/src/http/request.rs new file mode 100644 index 0000000..885a4e5 --- /dev/null +++ b/src/http/request.rs @@ -0,0 +1,116 @@ +use constants; +use hyper::{ + client::{Body, RequestBuilder as HyperRequestBuilder}, + header::{Authorization, ContentType, Headers, UserAgent}, +}; +use super::{ + CLIENT, + TOKEN, + routing::RouteInfo, +}; + +pub struct RequestBuilder<'a> { + body: Option<&'a [u8]>, + headers: Option<Headers>, + route: RouteInfo<'a>, +} + +impl<'a> RequestBuilder<'a> { + pub fn new(route_info: RouteInfo<'a>) -> Self { + Self { + body: None, + headers: None, + route: route_info, + } + } + + pub fn build(self) -> Request<'a> { + Request::new(self) + } + + pub fn body(&mut self, body: Option<&'a [u8]>) -> &mut Self { + self.body = body; + + self + } + + pub fn headers(&mut self, headers: Option<Headers>) -> &mut Self { + self.headers = headers; + + self + } + + pub fn route(&mut self, route_info: RouteInfo<'a>) -> &mut Self { + self.route = route_info; + + self + } +} + +#[derive(Clone, Debug)] +pub struct Request<'a> { + pub(super) body: Option<&'a [u8]>, + pub(super) headers: Option<Headers>, + pub(super) route: RouteInfo<'a>, +} + +impl<'a> Request<'a> { + pub fn new(builder: RequestBuilder<'a>) -> Self { + let RequestBuilder { body, headers, route } = builder; + + Self { body, headers, route } + } + + pub fn build(&'a self) -> HyperRequestBuilder<'a> { + let Request { + body, + headers: request_headers, + route: route_info, + } = self; + let (method, _, path) = route_info.deconstruct(); + + let mut builder = CLIENT.request( + method.hyper_method(), + &path.into_owned(), + ); + + if let Some(bytes) = body { + builder = builder.body(Body::BufBody(bytes, bytes.len())); + } + + let mut headers = Headers::new(); + headers.set(UserAgent(constants::USER_AGENT.to_string())); + headers.set(Authorization(TOKEN.lock().clone())); + headers.set(ContentType::json()); + + if let Some(request_headers) = request_headers.clone() { + headers.extend(request_headers.iter()); + } + + builder.headers(headers) + } + + pub fn body_ref(&self) -> &Option<&'a [u8]> { + &self.body + } + + pub fn body_mut(&mut self) -> &mut Option<&'a [u8]> { + &mut self.body + } + + pub fn headers_ref(&self) -> &Option<Headers> { + &self.headers + } + + pub fn headers_mut(&mut self) -> &mut Option<Headers> { + &mut self.headers + } + + pub fn route_ref(&self) -> &RouteInfo { + &self.route + } + + pub fn route_mut(&mut self) -> &mut RouteInfo<'a> { + &mut self.route + } +} |