reqores_client_surf/
api_client.rs1use reqores::{ClientRequest, HttpMethod};
2use surf::Client;
3
4use crate::client_response::SurfClientResponse;
5
6pub struct SurfClient(Client);
7
8impl SurfClient {
9 pub fn new() -> Self {
10 SurfClient(Client::new())
11 }
12 pub fn with_client(client: Client) -> Self {
13 SurfClient(client)
14 }
15}
16
17impl SurfClient {
18 pub async fn call<Req: ClientRequest>(
19 &self,
20 client_request: Req,
21 ) -> surf::Result<Req::Response> {
22 let mut request = match client_request.method() {
23 HttpMethod::Get => self.0.get(&client_request.url()),
24 HttpMethod::Put => self.0.put(&client_request.url()),
25 HttpMethod::Post => self.0.post(&client_request.url()),
26 HttpMethod::Delete => self.0.delete(&client_request.url()),
27 HttpMethod::Patch => self.0.patch(&client_request.url()),
28 };
29 for (k, v) in client_request.headers() {
30 request = request.header(&*k, v);
31 }
32
33 if let Some(body) = client_request.body() {
34 request = request.body(body);
35 }
36
37 let response = request.send().await?;
38 let client_response = SurfClientResponse::new(response).await?;
39
40 client_request
41 .deserialize(&client_response)
42 .map_err(|s| surf::Error::from_str(500, s))
43 }
44}