reqwest_rate_limit/reqwest_wrapper/
client.rs1use crate::{NoopResponseMiddleware, RequestBuilder, ResponseMiddleware};
2use std::sync::Arc;
3
4#[derive(Debug, Clone)]
6pub struct Client<MW = NoopResponseMiddleware> {
7 inner: reqwest::Client,
8 response_middleware: MW,
9 rate_limiter: Option<Arc<governor::DefaultDirectRateLimiter>>,
10}
11
12impl Client {
13 pub fn builder() -> ClientBuilder<NoopResponseMiddleware> {
15 ClientBuilder::new()
16 }
17}
18
19impl<MW> Client<MW>
20where
21 MW: ResponseMiddleware + Clone,
22{
23 pub fn get<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
25 let inner = self.inner.get(url);
26 RequestBuilder::from_parts(self.clone(), inner)
27 }
28
29 pub fn post<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
31 let inner = self.inner.post(url);
32 RequestBuilder::from_parts(self.clone(), inner)
33 }
34
35 pub fn put<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
37 let inner = self.inner.put(url);
38 RequestBuilder::from_parts(self.clone(), inner)
39 }
40
41 pub fn patch<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
43 let inner = self.inner.patch(url);
44 RequestBuilder::from_parts(self.clone(), inner)
45 }
46
47 pub fn delete<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
49 let inner = self.inner.delete(url);
50 RequestBuilder::from_parts(self.clone(), inner)
51 }
52
53 pub fn head<U: reqwest::IntoUrl>(&self, url: U) -> RequestBuilder<MW> {
55 let inner = self.inner.head(url);
56 RequestBuilder::from_parts(self.clone(), inner)
57 }
58
59 pub fn request<U: reqwest::IntoUrl>(
61 &self,
62 method: reqwest::Method,
63 url: U,
64 ) -> RequestBuilder<MW> {
65 let inner = self.inner.request(method, url);
66 RequestBuilder::from_parts(self.clone(), inner)
67 }
68
69 pub(crate) fn middleware(&self) -> &MW {
70 &self.response_middleware
71 }
72
73 pub(crate) fn rate_limiter(&self) -> Option<Arc<governor::DefaultDirectRateLimiter>> {
74 self.rate_limiter.clone()
75 }
76}
77
78pub struct ClientBuilder<MW> {
80 inner: reqwest::ClientBuilder,
81 response_middleware: MW,
82 rate_limiter: Option<Arc<governor::DefaultDirectRateLimiter>>,
83}
84
85impl Default for ClientBuilder<NoopResponseMiddleware> {
86 fn default() -> Self {
87 Self::new()
88 }
89}
90
91impl ClientBuilder<NoopResponseMiddleware> {
92 pub fn new() -> Self {
94 Self {
95 inner: reqwest::Client::builder(),
96 response_middleware: NoopResponseMiddleware,
97 rate_limiter: None,
98 }
99 }
100}
101
102impl<MW> ClientBuilder<MW>
103where
104 MW: ResponseMiddleware + Clone,
105{
106 pub fn from_reqwest_builder(inner: reqwest::ClientBuilder, response_middleware: MW) -> Self {
120 Self {
121 inner,
122 response_middleware,
123 rate_limiter: None,
124 }
125 }
126
127 pub fn configure<F>(self, f: F) -> Self
138 where
139 F: FnOnce(reqwest::ClientBuilder) -> reqwest::ClientBuilder,
140 {
141 Self {
142 inner: f(self.inner),
143 response_middleware: self.response_middleware,
144 rate_limiter: self.rate_limiter,
145 }
146 }
147
148 pub fn response_middleware<NewMW>(self, response_middleware: NewMW) -> ClientBuilder<NewMW>
150 where
151 NewMW: ResponseMiddleware + Clone,
152 {
153 ClientBuilder {
154 inner: self.inner,
155 response_middleware,
156 rate_limiter: self.rate_limiter,
157 }
158 }
159
160 pub fn rate_limiter(
179 self,
180 rate_limiter: Arc<governor::DefaultDirectRateLimiter>,
181 ) -> ClientBuilder<MW> {
182 ClientBuilder {
183 inner: self.inner,
184 response_middleware: self.response_middleware,
185 rate_limiter: Some(rate_limiter),
186 }
187 }
188
189 pub fn user_agent<V>(self, value: V) -> Self
191 where
192 V: TryInto<reqwest::header::HeaderValue>,
193 V::Error: Into<http::Error>,
194 {
195 Self {
196 inner: self.inner.user_agent(value),
197 response_middleware: self.response_middleware,
198 rate_limiter: self.rate_limiter,
199 }
200 }
201
202 pub fn default_headers(self, headers: reqwest::header::HeaderMap) -> Self {
204 Self {
205 inner: self.inner.default_headers(headers),
206 response_middleware: self.response_middleware,
207 rate_limiter: self.rate_limiter,
208 }
209 }
210
211 pub fn timeout(self, timeout: std::time::Duration) -> Self {
213 Self {
214 inner: self.inner.timeout(timeout),
215 response_middleware: self.response_middleware,
216 rate_limiter: self.rate_limiter,
217 }
218 }
219
220 pub fn build(self) -> Result<Client<MW>, reqwest::Error> {
222 let inner = self.inner.build()?;
223 Ok(Client {
224 inner,
225 response_middleware: self.response_middleware,
226 rate_limiter: self.rate_limiter,
227 })
228 }
229
230 pub fn attach_client(self, client: reqwest::Client) -> Client<MW> {
232 Client {
233 inner: client,
234 response_middleware: self.response_middleware,
235 rate_limiter: self.rate_limiter,
236 }
237 }
238}