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