Skip to main content

flagrant_client/
lib.rs

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}