termii_rust/blocking/http/
client.rs

1use std::collections::HashMap;
2
3use reqwest::{
4    blocking::{Client, Response},
5    Method, Url,
6};
7use serde;
8
9use crate::common::errors::HttpError;
10
11#[derive(Debug)]
12pub struct HttpClient {
13    base_url: Url,
14    client: Client,
15    timeout: u64,
16}
17
18impl HttpClient {
19    pub fn new(timeout: u64) -> Result<HttpClient, HttpError> {
20        if timeout < 1 {
21            return Err(HttpError::InvalidTimeout(timeout));
22        }
23
24        let base_url = Url::parse("https://api.ng.termii.com/api/")
25            .map_err(|err| HttpError::UrlParseError(err.to_string()))?;
26
27        let client = Client::builder()
28            .timeout(std::time::Duration::from_secs(timeout))
29            .build()?;
30
31        Ok(HttpClient {
32            base_url: base_url,
33            client: client,
34            timeout: timeout,
35        })
36    }
37
38    fn request<T>(
39        &self,
40        url: &str,
41        method: Method,
42        params: Option<HashMap<&str, &str>>,
43        _headers: Option<HashMap<&str, &str>>,
44        data: Option<T>,
45    ) -> Result<Response, HttpError>
46    where
47        T: serde::Serialize,
48    {
49        let timeout = Some(self.timeout);
50
51        let url = self
52            .base_url
53            .join(url)
54            .map_err(|err| HttpError::UrlParseError(err.to_string()))?;
55
56        let mut _client = self
57            .client
58            .request(method, url)
59            .timeout(std::time::Duration::from_millis(timeout.unwrap() * 1000));
60
61        if let Some(params) = params {
62            _client = _client.query(&params);
63        }
64
65        if let Some(data) = data {
66            _client = _client.json(&data);
67        }
68
69        let response = _client.send()?;
70
71        Ok(response)
72    }
73
74    pub fn get(
75        &self,
76        url: &str,
77        params: Option<HashMap<&str, &str>>,
78        headers: Option<HashMap<&str, &str>>,
79    ) -> Result<Response, HttpError> {
80        self.request(url, Method::GET, params, headers, None::<u8>)
81    }
82
83    pub fn post<T>(
84        &self,
85        url: &str,
86        params: Option<HashMap<&str, &str>>,
87        headers: Option<HashMap<&str, &str>>,
88        data: Option<T>,
89    ) -> Result<Response, HttpError>
90    where
91        T: serde::Serialize,
92    {
93        self.request(url, Method::POST, params, headers, data)
94    }
95
96    pub fn patch<T>(
97        &self,
98        url: &str,
99        params: Option<HashMap<&str, &str>>,
100        headers: Option<HashMap<&str, &str>>,
101        data: Option<T>,
102    ) -> Result<Response, HttpError>
103    where
104        T: serde::Serialize,
105    {
106        self.request(url, Method::PATCH, params, headers, data)
107    }
108
109    pub fn delete(
110        &self,
111        url: &str,
112        params: Option<HashMap<&str, &str>>,
113        headers: Option<HashMap<&str, &str>>,
114    ) -> Result<Response, HttpError> {
115        self.request(url, Method::DELETE, params, headers, None::<u8>)
116    }
117}