reqores_client_surf/
api_client.rs

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