taskrs_client/
lib.rs

1use anyhow::bail;
2use anyhow::Result;
3use libtaskrs::task::{TaskId, TaskRequest, TaskResponse};
4use log::debug;
5use reqwest::Response;
6use reqwest::{Client, ClientBuilder};
7use serde::{Deserialize, Serialize};
8
9pub struct TaskClient {
10    client: Client,
11    base_url: String,
12    task_url: String,
13}
14
15impl TaskClient {
16    pub fn new(base_url: &str, app_name: &str, app_version: &str) -> Result<Self> {
17        let user_agent = format!("{}/{}", app_name, app_version);
18        let client = ClientBuilder::new().user_agent(user_agent).build().unwrap();
19
20        let mut base_url = base_url.to_string();
21        base_url.push_str("/api/v1");
22        let mut task_url = base_url.clone();
23        task_url.push_str("/tasks");
24
25        Ok(Self {
26            client,
27            base_url,
28            task_url,
29        })
30    }
31
32    async fn get(&self, url: &str) -> Result<Response> {
33        let response = self
34            .client
35            .get(url)
36            .send()
37            .await
38            .expect("Unable to contact server");
39        debug!("Status code: {}", response.status());
40        if let Err(e) = response.error_for_status_ref() {
41            bail!("Server returned error: {}", e);
42        }
43        Ok(response)
44    }
45
46    pub async fn get_all_tasks(&self) -> Result<Vec<TaskResponse>> {
47        let r = self.get(&self.task_url).await?;
48        let tasks = r.json::<Vec<TaskResponse>>().await.unwrap();
49        Ok(tasks)
50    }
51
52    pub async fn get_task(&self, id: TaskId) -> Result<TaskResponse> {
53        let url = format!("{}/{}", self.task_url, id);
54        let r = self.get(&url).await?;
55        let task = r.json::<TaskResponse>().await.unwrap();
56        Ok(task)
57    }
58
59    pub async fn add_task(&self, task: TaskRequest) -> Result<TaskId> {
60        let r = self
61            .client
62            .post(&self.task_url)
63            .json(&task)
64            .send()
65            .await
66            .unwrap();
67        if let Err(e) = r.error_for_status_ref() {
68            bail!("Server returned error: {}", e);
69        }
70        let id = r.json::<TaskId>().await.unwrap();
71        Ok(id)
72    }
73
74    pub async fn update_task(&self, id: TaskId, updated_task: TaskRequest) -> Result<()> {
75        let url = format!("{}/{}", self.task_url, id);
76        let r = self
77            .client
78            .post(&url)
79            .json(&updated_task)
80            .send()
81            .await
82            .unwrap();
83        if let Err(e) = r.error_for_status_ref() {
84            bail!("Server returned error: {}", e);
85        }
86        Ok(())
87    }
88
89    pub async fn delete_task(&self, id: TaskId) -> Result<()> {
90        let url = format!("{}/{}", self.task_url, id);
91        let r = self.client.delete(&url).send().await.unwrap();
92        if let Err(e) = r.error_for_status_ref() {
93            bail!("Server returned error: {}", e);
94        }
95        Ok(())
96    }
97}