luct_client/impls/
reqwest.rs1use 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}