use super::*;
#[derive(Default)]
pub struct TaskDraft<'a> {
pub name: Option<&'a str>,
pub command: Option<&'a str>,
pub schedule: Option<&'a str>,
pub enabled: Option<bool>,
}
impl ApiClient {
pub async fn tasks(&self, service_environment_id: &str) -> Result<Answer<TasksPage>> {
self.get_answer(&format!(
"/api/infra/services/{service_environment_id}/tasks"
))
.await
}
pub async fn create_task(
&self,
service_environment_id: &str,
draft: &TaskDraft<'_>,
) -> Result<Answer<TaskPage>> {
self.post_answer(
&format!("/api/infra/services/{service_environment_id}/tasks"),
&task_body(draft),
)
.await
}
pub async fn update_task(
&self,
task_id: &str,
draft: &TaskDraft<'_>,
) -> Result<Answer<TaskPage>> {
self.answer(
Method::PATCH,
&format!("/api/infra/tasks/{task_id}"),
Some(&task_body(draft)),
)
.await
}
pub async fn delete_task(&self, task_id: &str) -> Result<()> {
self.delete(&format!("/api/infra/tasks/{task_id}")).await
}
pub async fn run_task(&self, task_id: &str) -> Result<Answer<TaskRunPage>> {
self.post_answer(
&format!("/api/infra/tasks/{task_id}/run"),
&serde_json::json!({}),
)
.await
}
pub async fn task_runs(&self, task_id: &str) -> Result<Answer<TaskRunsPage>> {
self.get_answer(&format!("/api/infra/tasks/{task_id}/runs"))
.await
}
pub async fn task_run(&self, run_id: &str) -> Result<Answer<TaskRunPage>> {
self.get_answer(&format!("/api/infra/task-runs/{run_id}"))
.await
}
}
fn task_body(draft: &TaskDraft<'_>) -> serde_json::Value {
let mut body = serde_json::Map::new();
if let Some(name) = draft.name {
body.insert("name".into(), name.into());
}
if let Some(command) = draft.command {
body.insert("command".into(), command.into());
}
if let Some(schedule) = draft.schedule {
body.insert("schedule".into(), schedule.into());
}
if let Some(enabled) = draft.enabled {
body.insert("enabled".into(), enabled.into());
}
serde_json::Value::Object(body)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_should_send_only_what_changes() {
let draft = TaskDraft {
enabled: Some(false),
..TaskDraft::default()
};
assert_eq!(task_body(&draft), serde_json::json!({ "enabled": false }));
}
}