termii_rust/blocking/http/
client.rs1use 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(¶ms);
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}