Skip to main content

flagrant_client/
blocking.rs

1use reqwest::blocking::Response;
2use serde::{de::DeserializeOwned, Serialize};
3
4#[derive(Debug)]
5pub struct HttpClient {
6    api_host: String,
7    client: reqwest::blocking::Client,
8}
9
10impl HttpClient {
11    pub fn new(api_host: String) -> HttpClient {
12        let client = reqwest::blocking::Client::new();
13        HttpClient { api_host, client }
14    }
15
16    pub fn get<T: DeserializeOwned>(&self, path: String) -> anyhow::Result<T> {
17        let result = reqwest::blocking::get(format!("{}{}", self.api_host, path));
18
19        match result {
20            Ok(response) if response.status().is_success() => Ok(response.json::<T>()?),
21            Ok(response) => Err(anyhow::anyhow!(response.text()?)),
22            Err(err) => Err(err.into()),
23        }
24    }
25
26    pub fn put<P: Serialize>(&self, path: String, payload: P) -> anyhow::Result<()> {
27        let result = self
28            .client
29            .put(format!("{}{}", self.api_host, path))
30            .json(&payload)
31            .send();
32
33        match result {
34            Ok(response) if response.status().is_success() => Ok(()),
35            Ok(response) => Err(anyhow::anyhow!(response.text()?)),
36            Err(err) => Err(err.into()),
37        }
38    }
39
40    pub fn post<P: Serialize, T: DeserializeOwned>(
41        &self,
42        path: String,
43        payload: P,
44    ) -> anyhow::Result<T> {
45        let result = self
46            .client
47            .post(format!("{}{}", self.api_host, path))
48            .json(&payload)
49            .send();
50
51        match result {
52            Ok(response) if response.status().is_success() => Ok(response.json::<T>()?),
53            Ok(response) => Err(anyhow::anyhow!(response.text()?)),
54            Err(err) => Err(err.into()),
55        }
56    }
57
58    pub fn delete(&self, path: String) -> anyhow::Result<Response> {
59        let result = self
60            .client
61            .delete(format!("{}{}", self.api_host, path))
62            .send();
63
64        match result {
65            Ok(response) if response.status().is_success() => Ok(response),
66            Ok(response) => Err(anyhow::anyhow!(response.text()?)),
67            Err(err) => Err(err.into()),
68        }
69    }
70}