Skip to main content

luct_client/impls/
reqwest.rs

1//! Implementation of the [`Client`] trait using [`reqwest`]
2
3use crate::{Client, ClientError};
4use reqwest::Response;
5use std::sync::Arc;
6use url::Url;
7
8#[derive(Debug, Clone, Default)]
9pub struct ReqwestClient {
10    client: reqwest::Client,
11}
12
13impl ReqwestClient {
14    pub fn new(agent: &str) -> Self {
15        #[cfg(not(any(target_arch = "wasm32", target_arch = "wasm64")))]
16        let _ = rustls_rustcrypto::provider().install_default();
17
18        Self {
19            client: reqwest::Client::builder()
20                .user_agent(agent)
21                .build()
22                .expect("Failed to initialize reqwest client"),
23        }
24    }
25}
26
27impl Client for ReqwestClient {
28    async fn get(
29        &self,
30        url: &Url,
31        params: &[(&str, &str)],
32    ) -> Result<(u16, Arc<String>), ClientError> {
33        let response = self.request(url, params).await?;
34        let status = response.status().as_u16();
35        let data = response
36            .text()
37            .await
38            .map_err(|err| ClientError::ConnectionErrorStd(Arc::new(err)))?;
39
40        Ok((status, Arc::new(data)))
41    }
42
43    async fn get_bin(
44        &self,
45        url: &Url,
46        params: &[(&str, &str)],
47    ) -> Result<(u16, Arc<Vec<u8>>), ClientError> {
48        let response = self.request(url, params).await?;
49        let status = response.status().as_u16();
50        let data = response
51            .bytes()
52            .await
53            .map_err(|err| ClientError::ConnectionErrorStd(Arc::new(err)))?;
54
55        Ok((status, Arc::new(data.to_vec())))
56    }
57}
58
59impl ReqwestClient {
60    async fn request(&self, url: &Url, params: &[(&str, &str)]) -> Result<Response, ClientError> {
61        self.client
62            .get(url.clone())
63            .query(params)
64            .send()
65            .await
66            .map_err(|err| ClientError::ConnectionErrorStd(Arc::new(err)))
67    }
68}