rosu_render/request/
mod.rs

1mod future;
2mod render;
3mod render_list;
4mod requestable;
5mod server_list;
6mod server_online_count;
7mod skin_custom;
8mod skin_list;
9
10use form_urlencoded::Serializer as FormSerializer;
11use hyper::Method;
12use serde::Serialize;
13use serde_urlencoded::Serializer as UrlSerializer;
14
15use crate::{client::RatelimiterKind, routing::Route, util::multipart::Form, ClientError};
16
17pub(crate) use self::requestable::Requestable;
18
19pub use self::{
20    future::OrdrFuture, render::CommissionRender, render_list::GetRenderList,
21    server_list::GetServerList, server_online_count::GetServerOnlineCount,
22    skin_custom::GetSkinCustom, skin_list::GetSkinList,
23};
24
25pub(crate) struct Request {
26    pub(crate) form: Option<Form>,
27    pub(crate) method: Method,
28    pub(crate) path: String,
29    pub(crate) ratelimiter: RatelimiterKind,
30}
31
32impl Request {
33    pub fn builder(route: Route) -> RequestBuilder {
34        RequestBuilder::new(route)
35    }
36
37    pub fn from_route(route: Route) -> Self {
38        Self {
39            form: None,
40            method: route.method(),
41            path: route.to_string(),
42            ratelimiter: route.ratelimiter(),
43        }
44    }
45}
46
47pub(crate) struct RequestBuilder(Request);
48
49impl RequestBuilder {
50    pub fn new(route: Route) -> Self {
51        Self(Request::from_route(route))
52    }
53
54    pub fn build(self) -> Request {
55        self.0
56    }
57
58    pub fn form(mut self, form: Form) -> Self {
59        self.0.form = Some(form);
60
61        self
62    }
63
64    /// Add a query to the end of the path. Be sure this is only called once!
65    pub fn query(mut self, query: impl Serialize) -> Result<Self, ClientError> {
66        self.0.path.push('?');
67        let len = self.0.path.len();
68
69        let mut form_serializer = FormSerializer::for_suffix(&mut self.0.path, len);
70        let url_serializer = UrlSerializer::new(&mut form_serializer);
71        query.serialize(url_serializer).map_err(ClientError::from)?;
72
73        Ok(self)
74    }
75}