1pub mod blocking;
2pub mod resource;
3
4use flagrant_types::Project;
5use serde::{de::DeserializeOwned, Serialize};
6
7#[derive(Debug)]
8pub struct HttpClient {
9 api_host: String,
10 project_id: u16,
11 client: reqwest::Client,
12}
13
14impl HttpClient {
15 pub fn new(api_host: String, project_id: u16) -> HttpClient {
16 HttpClient {
17 api_host,
18 project_id,
19 client: reqwest::Client::new(),
20 }
21 }
22
23 pub async fn get<S: AsRef<str>, T: DeserializeOwned>(&self, path: S) -> anyhow::Result<T> {
24 Ok(reqwest::get(format!(
25 "{}/projects/{}{}",
26 self.api_host,
27 self.project_id,
28 path.as_ref()
29 ))
30 .await?
31 .json::<T>()
32 .await?)
33 }
34
35 pub async fn put<S: AsRef<str>, P: Serialize>(
36 &self,
37 path: S,
38 payload: &P,
39 ) -> anyhow::Result<()> {
40 self.client
41 .put(format!(
42 "{}/projects/{}{}",
43 self.api_host,
44 self.project_id,
45 path.as_ref()
46 ))
47 .json(payload)
48 .send()
49 .await?;
50
51 Ok(())
52 }
53
54 pub async fn post<S: AsRef<str>, P: Serialize, T: DeserializeOwned>(
55 &self,
56 path: S,
57 payload: &P,
58 ) -> anyhow::Result<T> {
59 Ok(self
60 .client
61 .post(format!(
62 "{}/projects/{}{}",
63 self.api_host,
64 self.project_id,
65 path.as_ref()
66 ))
67 .json(payload)
68 .send()
69 .await?
70 .json::<T>()
71 .await?)
72 }
73
74 pub async fn project(&self) -> anyhow::Result<Project> {
75 self.get::<_, Project>("").await
76 }
77}