Skip to main content

rosu_render/request/
mod.rs

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