From 058ca299a157bdfd1058bcd615b3600caa7007a5 Mon Sep 17 00:00:00 2001 From: ghassmo Date: Tue, 3 May 2022 14:39:04 +0300 Subject: [PATCH] bin/tau-cli: clean up filter function --- bin/tau/tau-cli/src/main.rs | 8 +-- bin/tau/tau-cli/src/util.rs | 107 +++++++++++------------------------- 2 files changed, 35 insertions(+), 80 deletions(-) diff --git a/bin/tau/tau-cli/src/main.rs b/bin/tau/tau-cli/src/main.rs index 8ff7f0b00..d071ab618 100644 --- a/bin/tau/tau-cli/src/main.rs +++ b/bin/tau/tau-cli/src/main.rs @@ -60,11 +60,9 @@ async fn start(options: CliTau) -> Result<()> { let rank = rank.unwrap_or(0.0); - add( - rpc_addr, - json!([{"title": title, "desc": desc, "assign": assign, "project": project, "due": due, "rank": rank}]), - ) - .await?; + add(rpc_addr, + json!([{"title": title, "desc": desc, "assign": assign, "project": project, "due": due, "rank": rank}]), + ).await?; } Some(CliTauSubCommands::Update { id, key, value }) => { diff --git a/bin/tau/tau-cli/src/util.rs b/bin/tau/tau-cli/src/util.rs index 0ca339ccb..318ff78be 100644 --- a/bin/tau/tau-cli/src/util.rs +++ b/bin/tau/tau-cli/src/util.rs @@ -241,22 +241,21 @@ pub fn get_events(rep: Value) -> Result { } pub fn timestamp_to_date(timestamp: Value, dt: &str) -> String { - let result = if timestamp.is_u64() { - let timestamp = timestamp.as_i64().unwrap(); - match dt { - "date" => { - NaiveDateTime::from_timestamp(timestamp, 0).date().format("%A %-d %B").to_string() - } - "datetime" => { - NaiveDateTime::from_timestamp(timestamp, 0).format("%H:%M %A %-d %B").to_string() - } - _ => "".to_string(), - } - } else { - "".to_string() - }; + let timestamp = timestamp.as_i64().unwrap_or(0); - result + if timestamp <= 0 { + return "".to_string() + } + + match dt { + "date" => { + NaiveDateTime::from_timestamp(timestamp, 0).date().format("%A %-d %B").to_string() + } + "datetime" => { + NaiveDateTime::from_timestamp(timestamp, 0).format("%H:%M %A %-d %B").to_string() + } + _ => "".to_string(), + } } pub fn get_from_task(task: Value, value: &str) -> Result { @@ -271,53 +270,22 @@ pub fn get_from_task(task: Value, value: &str) -> Result { Ok(result) } -fn filter_tasks(tasks: Vec, filter: Option) -> Result> { - let filter = match filter { - Some(f) => f, - None => "all".to_string(), - }; +// Helper function to check task's state +fn check_task_state(task: &Value, state: &str) -> bool { + let mut default_events = serde_json::Map::new(); + default_events.insert("action".into(), "open".into()); + let default_events: Vec = vec![Value::from(default_events)]; + let last_event = task["events"].as_array().unwrap_or(&default_events).last().unwrap(); + let last_state = last_event["action"].as_str().unwrap(); + state == last_state +} + +fn apply_filter(tasks: Vec, filter: String) -> Result> { let filtered_tasks: Vec = match filter.as_str() { - "all" => tasks, - - "open" => tasks - .into_iter() - .filter(|task| { - let events = match task["events"].as_array() { - Some(t) => t.to_owned(), - None => { - error!("Value is not an array!"); - vec![] - } - }; - - let state = match events.last() { - Some(s) => s["action"].as_str().unwrap(), - None => "open", - }; - state == "open" - }) - .collect(), - - "pause" => tasks - .into_iter() - .filter(|task| { - let events = match task["events"].as_array() { - Some(t) => t.to_owned(), - None => { - error!("Value is not an array!"); - vec![] - } - }; - - let state = match events.last() { - Some(s) => s["action"].as_str().unwrap(), - None => "open", - }; - state == "pause" - }) - .collect(), - + "open" => tasks.into_iter().filter(|task| check_task_state(task, "open")).collect(), + "pause" => tasks.into_iter().filter(|task| check_task_state(task, "pause")).collect(), + "stop" => tasks.into_iter().filter(|task| check_task_state(task, "stop")).collect(), "month" => tasks .into_iter() .filter(|task| { @@ -331,22 +299,11 @@ fn filter_tasks(tasks: Vec, filter: Option) -> Result> _ if filter.contains("assign:") | filter.contains("project:") => { let kv: Vec<&str> = filter.split(':').collect(); let key = kv[0]; - let value = kv[1]; + let value = Value::from(kv[1]); tasks .into_iter() - .filter(|task| { - match task[key].as_array() { - Some(t) => t.to_owned(), - None => { - error!("Value is not an array!"); - vec![] - } - } - .iter() - .map(|s| s.as_str().unwrap()) - .any(|x| x == value) - }) + .filter(|task| task[key].as_array().unwrap_or(&vec![]).contains(&value)) .collect() } @@ -386,8 +343,8 @@ pub fn list_tasks(rep: Value, filters: Vec) -> Result<()> { let mut tasks: Vec = serde_json::from_value(rep)?; for filter in filters { - let temp = tasks; - tasks = filter_tasks(temp, Some(filter))?; + // TODO need to use iterator or reference instead of copy + tasks = apply_filter(tasks, filter)?; } tasks.sort_by(|a, b| b["rank"].as_f64().partial_cmp(&a["rank"].as_f64()).unwrap());