octocrate_core/
request_builder.rs

1use 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}