octocrate_core/
request_builder.rs1use crate::{api_config::SharedAPIConfig, request::Request};
2use reqwest::Client;
3use std::marker::PhantomData;
4
5pub struct RequestBuilder<Body, Query, Response> {
6 builder: Option<reqwest::RequestBuilder>,
7 api_config: SharedAPIConfig,
8 _body: PhantomData<Body>,
9 _query: PhantomData<Query>,
10 _response: PhantomData<Response>,
11}
12
13impl<Body, Query, Response> RequestBuilder<Body, Query, Response>
14where
15 Body: serde::Serialize,
16 Query: serde::Serialize,
17 Response: serde::de::DeserializeOwned,
18{
19 pub fn new(config: &SharedAPIConfig) -> Self {
20 Self {
21 builder: None,
22 api_config: config.clone(),
23 _body: PhantomData,
24 _query: PhantomData,
25 _response: PhantomData,
26 }
27 }
28
29 pub fn get(mut self, url: impl Into<String>) -> Self {
30 let url = format!("{}{}", self.api_config.base_url, url.into());
31 let builder = Client::new().get(url);
32
33 self.builder = Some(builder);
34
35 self
36 }
37
38 pub fn post(mut self, url: impl Into<String>) -> Self {
39 let url = format!("{}{}", self.api_config.base_url, url.into());
40 let builder = Client::new().post(url);
41
42 self.builder = Some(builder);
43
44 self
45 }
46
47 pub fn put(mut self, url: impl Into<String>) -> Self {
48 let url = format!("{}{}", self.api_config.base_url, url.into());
49 let builder = Client::new().put(url);
50
51 self.builder = Some(builder);
52
53 self
54 }
55
56 pub fn patch(mut self, url: impl Into<String>) -> Self {
57 let url = format!("{}{}", self.api_config.base_url, url.into());
58 let builder = Client::new().patch(url);
59
60 self.builder = Some(builder);
61
62 self
63 }
64
65 pub fn delete(mut self, url: impl Into<String>) -> Self {
66 let url = format!("{}{}", self.api_config.base_url, url.into());
67 let builder = Client::new().delete(url);
68
69 self.builder = Some(builder);
70
71 self
72 }
73
74 pub fn build(self) -> Request<Body, Query, Response> {
75 Request {
76 builder: self.builder.expect("RequestBuilder is not configured"),
77 api_config: self.api_config.clone(),
78 _body: PhantomData,
79 _query: PhantomData,
80 _response: PhantomData,
81 }
82 }
83}