/* This file is part of DarkFi (https://dark.fi)
*
* Copyright (C) 2020-2023 Dyne.org foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
use darkfi::{rpc::jsonrpc::JsonRequest, Result};
use log::debug;
use tinyjson::JsonValue;
use crate::{
primitives::{BaseTask, State, TaskInfo},
Tau,
};
impl Tau {
pub async fn close_connection(&self) {
self.rpc_client.stop().await
}
/// Add a new task.
pub async fn add(&self, task: BaseTask) -> Result {
let mut params = vec![
JsonValue::String(task.title.clone()),
JsonValue::Array(task.tags.iter().map(|x| JsonValue::String(x.clone())).collect()),
JsonValue::String(task.desc.unwrap_or("".to_string())),
JsonValue::Array(task.assign.iter().map(|x| JsonValue::String(x.clone())).collect()),
JsonValue::Array(task.project.iter().map(|x| JsonValue::String(x.clone())).collect()),
];
let due = if let Some(num) = task.due {
JsonValue::String(num.to_string())
} else {
JsonValue::Null
};
params.push(due);
let rank =
if let Some(num) = task.rank { JsonValue::Number(num.into()) } else { JsonValue::Null };
params.push(rank);
let req = JsonRequest::new("add", params);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap() as u32)
}
/// Get current open tasks ids.
pub async fn get_ids(&self) -> Result> {
let req = JsonRequest::new("get_ids", vec![]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
let mut ret = vec![];
for i in rep.get::>().unwrap() {
ret.push(*i.get::().unwrap() as u32)
}
Ok(ret)
}
/// Update existing task given it's ID and some params.
pub async fn update(&self, id: u32, task: BaseTask) -> Result {
let mut params = vec![
JsonValue::String(task.title.clone()),
JsonValue::Array(task.tags.iter().map(|x| JsonValue::String(x.clone())).collect()),
JsonValue::String(task.desc.unwrap_or("".to_string())),
JsonValue::Array(task.assign.iter().map(|x| JsonValue::String(x.clone())).collect()),
JsonValue::Array(task.project.iter().map(|x| JsonValue::String(x.clone())).collect()),
];
let due = if let Some(num) = task.due {
JsonValue::String(num.to_string())
} else {
JsonValue::Null
};
params.push(due);
let rank =
if let Some(num) = task.rank { JsonValue::Number(num.into()) } else { JsonValue::Null };
params.push(rank);
let req = JsonRequest::new(
"update",
vec![JsonValue::Number(id.into()), JsonValue::Array(params)],
);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
/// Set the state for a task.
pub async fn set_state(&self, id: u32, state: &State) -> Result {
let req = JsonRequest::new(
"set_state",
vec![JsonValue::Number(id.into()), JsonValue::String(state.to_string())],
);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
/// Set a comment for a task.
pub async fn set_comment(&self, id: u32, content: &str) -> Result {
let req = JsonRequest::new(
"set_comment",
vec![JsonValue::Number(id.into()), JsonValue::String(content.to_string())],
);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
/// Get task data by its ID.
pub async fn get_task_by_id(&self, id: u32) -> Result {
let req = JsonRequest::new("get_task_by_id", vec![JsonValue::Number(id.into())]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
let rep = rep.into();
Ok(rep)
}
/// Get month's stopped tasks.
pub async fn get_stop_tasks(&self, month: Option) -> Result> {
let param = if let Some(month) = month {
JsonValue::String(month.to_string())
} else {
JsonValue::Null
};
let req = JsonRequest::new("get_stop_tasks", vec![param]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
let rep =
rep.get::>().unwrap().iter().map(|x| (*x).clone().into()).collect();
Ok(rep)
}
/// Switch workspace.
pub async fn switch_ws(&self, workspace: String) -> Result {
let req = JsonRequest::new("switch_ws", vec![JsonValue::String(workspace)]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
/// Get current workspace.
pub async fn get_ws(&self) -> Result {
let req = JsonRequest::new("get_ws", vec![]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(rep.get::().unwrap().clone())
}
/// Export tasks.
pub async fn export_to(&self, path: String) -> Result {
let req = JsonRequest::new("export", vec![JsonValue::String(path)]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
/// Import tasks.
pub async fn import_from(&self, path: String) -> Result {
let req = JsonRequest::new("import", vec![JsonValue::String(path)]);
let rep = self.rpc_client.request(req).await?;
debug!("Got reply: {:?}", rep);
Ok(*rep.get::().unwrap())
}
}