use reqwest::Method;
use serde::{Deserialize, Serialize};
use snafu::ResultExt;
use crate::models::{TaskStatusType, Tasks};
use crate::{Client, Http, RequestError, ReqwestProcessing, Serializing};
impl Client {
pub async fn list_tasks(&self, request: ListTasksRequest) -> Result<Tasks, RequestError> {
let url = self.url("/api/v2/tasks");
let response = self
.request(Method::GET, &url)
.query(&request)
.send()
.await
.context(ReqwestProcessing)?;
if !response.status().is_success() {
let status = response.status();
let text = response.text().await.context(ReqwestProcessing)?;
let res = Http { status, text }.fail();
return res;
}
let res = response.json::<Tasks>().await.context(ReqwestProcessing)?;
Ok(res)
}
pub async fn create_task(&self, request: CreateTaskRequest) -> Result<(), RequestError> {
let url = self.url("/api/v2/tasks");
let response = self
.request(Method::POST, &url)
.body(serde_json::to_string(&request).context(Serializing)?)
.send()
.await
.context(ReqwestProcessing)?;
if !response.status().is_success() {
let status = response.status();
let text = response.text().await.context(ReqwestProcessing)?;
Http { status, text }.fail()?;
}
Ok(())
}
pub async fn delete_task(&self, task_id: &str) -> Result<(), RequestError> {
let url = self.url(&format!("/api/v2/tasks/{}", task_id));
let response = self
.request(Method::DELETE, &url)
.send()
.await
.context(ReqwestProcessing)?;
if !response.status().is_success() {
let status = response.status();
let text = response.text().await.context(ReqwestProcessing)?;
Http { status, text }.fail()?;
}
Ok(())
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ListTasksRequest {
pub after: Option<String>,
pub limit: Option<u16>,
pub name: Option<String>,
pub org: Option<String>,
#[serde(rename = "orgID")]
pub org_id: Option<String>,
pub status: Option<String>,
#[serde(rename = "type")]
pub type_: Option<TaskStatusType>,
pub user: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateTaskRequest {
pub flux: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org: Option<String>,
#[serde(rename = "orgID", skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<TaskStatusType>,
}
impl CreateTaskRequest {
pub fn new(flux: String) -> Self {
Self {
flux,
description: None,
org: None,
org_id: None,
status: None,
}
}
}