diff --git a/src/main.rs b/src/main.rs index 736d95c..9ffb634 100644 --- a/src/main.rs +++ b/src/main.rs @@ -79,6 +79,10 @@ impl Drop for EventSender { } } +fn some_non_empty(str: &str) -> Option { + if str.is_empty() { None } else { Some(str.to_owned()) } +} + fn or_print(result: Result) -> Option { match result { Ok(value) => Some(value), @@ -330,7 +334,7 @@ async fn main() { } Some('?') => { - tasks.set_state_filter(Some(arg.to_string()).filter(|s| !s.is_empty())); + tasks.set_state_filter(some_non_empty(arg).filter(|s| !s.is_empty())); } Some('!') => match tasks.get_position() { @@ -348,10 +352,12 @@ async fn main() { Some('#') | Some('+') => { tasks.add_tag(arg.to_string()); + info!("Added tag filter for #{arg}") } Some('-') => { tasks.remove_tag(arg.to_string()); + info!("Removed tag filter for #{arg}") } Some('*') => { @@ -436,7 +442,7 @@ async fn main() { fn print_event(event: &Event) { debug!( - "At {} found {} kind {} '{}' {:?}", + "At {} found {} kind {} \"{}\" {:?}", event.created_at, event.id, event.kind, event.content, event.tags ); } diff --git a/src/task.rs b/src/task.rs index 9972a12..e782ed3 100644 --- a/src/task.rs +++ b/src/task.rs @@ -9,6 +9,7 @@ use log::{debug, error, info, trace, warn}; use nostr_sdk::{Alphabet, Event, EventBuilder, EventId, Kind, Tag, TagStandard, Timestamp}; use crate::kinds::is_hashtag; +use crate::some_non_empty; #[derive(Debug, Clone, PartialEq)] pub(crate) struct Task { @@ -62,13 +63,13 @@ impl Task { fn states(&self) -> impl Iterator + '_ { self.props.iter().filter_map(|event| { event.kind.try_into().ok().map(|s| TaskState { - name: Some(event.content.clone()).filter(|c| !c.is_empty()), + name: some_non_empty(&event.content), state: s, time: event.created_at.clone(), }) }) } - + pub(crate) fn state(&self) -> Option { self.states().max_by_key(|t| t.time) } @@ -117,7 +118,7 @@ impl Task { "{:?}", self.props .iter() - .map(|e| format!("{} kind {} '{}'", e.created_at, e.kind, e.content)) + .map(|e| format!("{} kind {} \"{}\"", e.created_at, e.kind, e.content)) .collect::>() )), "descriptions" => Some(format!( @@ -138,12 +139,14 @@ pub(crate) struct TaskState { pub(crate) time: Timestamp, } impl TaskState { + pub(crate) fn get_label_for(state: &State, comment: &str) -> String { + some_non_empty(comment).unwrap_or_else(|| state.to_string()) + } pub(crate) fn get_label(&self) -> String { self.name.clone().unwrap_or_else(|| self.state.to_string()) } pub(crate) fn matches_label(&self, label: &str) -> bool { - self.state == State::Active - || self.name.as_ref().is_some_and(|n| n.eq_ignore_ascii_case(label)) + self.name.as_ref().is_some_and(|n| n.eq_ignore_ascii_case(label)) || self.state.to_string().eq_ignore_ascii_case(label) } } diff --git a/src/tasks.rs b/src/tasks.rs index e79c1f2..a8aa157 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -13,7 +13,7 @@ use TagStandard::Hashtag; use crate::EventSender; use crate::kinds::*; -use crate::task::{State, Task}; +use crate::task::{State, Task, TaskState}; type TaskMap = HashMap; #[derive(Debug, Clone)] @@ -550,9 +550,12 @@ impl Tasks { } pub(crate) fn undo(&mut self) { + let mut count = 0; self.sender.clear().into_iter().rev().for_each(|event| { + count += 1; self.remove(&event) }); + info!("Reverted last {count} actions!") } fn remove(&mut self, event: &Event) { @@ -572,6 +575,7 @@ impl Tasks { comment, id, ); + info!("Task status {} set for \"{}\"", TaskState::get_label_for(&state, comment), self.get_task_title(&id)); self.submit(prop) } @@ -582,7 +586,7 @@ impl Tasks { pub(crate) fn make_note(&mut self, note: &str) { match self.position { - None => warn!("Cannot add note '{}' without active task", note), + None => warn!("Cannot add note \"{}\" without active task", note), Some(id) => { let prop = self.build_prop(Kind::TextNote, note, id); self.submit(prop);