Просмотр исходного кода

bin/tau-cli: more clean and explicit way to use args

ghassmo 4 лет назад
Родитель
Сommit
9ea0a43543
1 измененных файлов с 29 добавлено и 26 удалено
  1. 29 26
      bin/tau-cli/src/main.rs

+ 29 - 26
bin/tau-cli/src/main.rs

@@ -53,39 +53,38 @@ pub enum CliTauSubCommands {
     /// Update/Edit an existing task by ID
     Update {
         /// Task ID
-        #[clap(short, long)]
-        id: Option<u64>,
-        /// Data you want to change: "title: new title"
-        #[clap(short, long)]
-        data: Option<String>,
+        id: u64,
+        /// Field's name (ex title)
+        key: String,
+        /// New value
+        value: String,
     },
     /// Set task state
     SetState {
         /// Task ID
-        #[clap(short, long)]
         id: u64,
         /// Set task state
-        #[clap(short, long)]
         state: String,
     },
     /// Get task state
     GetState {
         /// Task ID
-        #[clap(short, long)]
         id: u64,
     },
     /// Set comment for a task
     SetComment {
         /// Task ID
-        #[clap(short, long)]
         id: u64,
         /// Comment author
-        #[clap(short, long)]
         author: String,
         /// Comment content
-        #[clap(short, long)]
         content: String,
     },
+    /// Get task's comments
+    GetComment {
+        /// Task ID
+        id: u64,
+    },
 }
 
 /// Tau cli
@@ -169,7 +168,7 @@ async fn list(url: &str, month: Option<i64>) -> Result<Value> {
 // Update task and returns `true` upon success.
 // --> {"jsonrpc": "2.0", "method": "update", "params": [task_id, {"title": "new title"} ], "id": 1}
 // <-- {"jsonrpc": "2.0", "result": true, "id": 1}
-async fn update(url: &str, id: Option<u64>, data: Value) -> Result<Value> {
+async fn update(url: &str, id: u64, data: Value) -> Result<Value> {
     let req = jsonrpc::request(json!("update"), json!([id, data]));
     request(req, url.to_string()).await
 }
@@ -322,29 +321,27 @@ async fn start(options: CliTau) -> Result<()> {
             table.printstd();
         }
 
-        Some(CliTauSubCommands::Update { id, data }) => {
-            let data = data.unwrap();
-            let kv: Vec<&str> = data.split(':').collect();
+        Some(CliTauSubCommands::Update { id, key, value }) => {
+            let value = value.as_str().trim();
 
-            let new_data = match kv[0].trim() {
-                "title" | "description" => {
-                    json!({kv[0].trim(): kv[1].trim()})
-                }
+            let updated_value: Value;
+
+            match key.as_str() {
                 "due" => {
-                    let parsed_data: Option<i64> = due_as_timestamp(kv[1].trim());
-                    json!({ kv[0].trim(): parsed_data })
+                    updated_value = json!(due_as_timestamp(value));
                 }
                 "rank" => {
-                    let parsed_data: u64 = kv[1].trim().parse()?;
-                    json!({ kv[0].trim(): parsed_data })
+                    updated_value = json!(value.parse::<u64>()?);
+                }
+                "project" | "assign" => {
+                    updated_value = json!(value.split(',').collect::<Vec<&str>>());
                 }
                 _ => {
-                    let parsed_data: Vec<&str> = kv[1].trim().split(':').collect();
-                    json!({ kv[0].trim(): parsed_data })
+                    updated_value = json!(value);
                 }
             };
 
-            update(rpc_addr, id, new_data).await?;
+            update(rpc_addr, id, json!({ key: updated_value })).await?;
         }
 
         Some(CliTauSubCommands::SetState { id, state }) => {
@@ -359,6 +356,12 @@ async fn start(options: CliTau) -> Result<()> {
         Some(CliTauSubCommands::SetComment { id, author, content }) => {
             set_comment(rpc_addr, id, author.trim(), content.trim()).await?;
         }
+
+        Some(CliTauSubCommands::GetComment { id }) => {
+            // TODO
+            println!("no comments: {}", id);
+        }
+
         _ => {
             error!("Please run 'tau help' to see usage.");
             return Err(Error::MissingParams)