| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- use serde::{Deserialize, Serialize};
- use structopt::StructOpt;
- use structopt_toml::StructOptToml;
- use darkfi::Result;
- use super::util::due_as_timestamp;
- /// Tau cli
- #[derive(Debug, Deserialize, StructOpt, StructOptToml)]
- #[serde(default)]
- #[structopt(name = "tau")]
- pub struct CliTau {
- /// Increase verbosity
- #[structopt(short, parse(from_occurrences))]
- pub verbose: u8,
- /// JSON-RPC listen URL
- #[structopt(long = "rpc", default_value = "tcp://127.0.0.1:11055")]
- pub rpc_listen: String,
- /// Sets a custom config file
- #[structopt(short, long)]
- pub config: Option<String>,
- #[structopt(subcommand)]
- pub command: Option<CliTauSubCommands>,
- /// Get task by ID
- pub id: Option<String>,
- /// Search criteria (zero or more)
- #[structopt(multiple = true)]
- pub filters: Vec<String>,
- }
- #[derive(StructOpt, Deserialize, Debug)]
- pub enum CliTauSubCommands {
- /// Add a new task
- Add { values: Vec<String> },
- /// Update/Edit an existing task by ID
- Update {
- /// Task ID
- id: u64,
- /// Values (ex: project:blockchain)
- values: Vec<String>,
- },
- /// Set or Get task state
- State {
- /// Task ID
- id: u64,
- /// Set task state
- state: Option<String>,
- },
- /// Set or Get comment for a task
- Comment {
- /// Task ID
- id: u64,
- /// Comment content
- content: Option<String>,
- },
- /// List all tasks
- List {},
- }
- #[derive(Serialize, Debug, Clone)]
- pub struct CliBaseTask {
- pub title: String,
- pub desc: Option<String>,
- pub assign: Vec<String>,
- pub project: Vec<String>,
- pub due: Option<i64>,
- pub rank: Option<f32>,
- }
- pub fn task_from_cli_values(values: Vec<String>) -> Result<CliBaseTask> {
- let mut title: String = String::new();
- let mut desc: Option<String> = None;
- let mut project: Vec<String> = vec![];
- let mut assign: Vec<String> = vec![];
- let mut due: Option<i64> = None;
- let mut rank: Option<f32> = None;
- for val in values {
- let field: Vec<&str> = val.split(':').collect();
- if field.len() == 1 {
- title = field[0].into();
- continue
- }
- if field.len() != 2 {
- continue
- }
- if field[0].starts_with("project") {
- project = field[1].split(',').map(|s| s.into()).collect();
- }
- if field[0].starts_with("desc") {
- desc = Some(field[1].into());
- }
- if field[0].starts_with("assign") {
- assign = field[1].split(',').map(|s| s.into()).collect();
- }
- if field[0].starts_with("due") {
- due = due_as_timestamp(&field[1])
- }
- if field[0].starts_with("rank") {
- rank = Some(field[1].parse::<f32>()?);
- }
- }
- let task = CliBaseTask { title, desc, project, assign, due, rank };
- Ok(task)
- }
|