feat: info feedback on what you are doing

This commit is contained in:
xeruf 2024-08-06 22:11:34 +03:00
parent b5b57b7ac9
commit f4f1b56f02
3 changed files with 22 additions and 9 deletions

View File

@ -79,6 +79,10 @@ impl Drop for EventSender {
} }
} }
fn some_non_empty(str: &str) -> Option<String> {
if str.is_empty() { None } else { Some(str.to_owned()) }
}
fn or_print<T, U: Display>(result: Result<T, U>) -> Option<T> { fn or_print<T, U: Display>(result: Result<T, U>) -> Option<T> {
match result { match result {
Ok(value) => Some(value), Ok(value) => Some(value),
@ -330,7 +334,7 @@ async fn main() {
} }
Some('?') => { 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() { Some('!') => match tasks.get_position() {
@ -348,10 +352,12 @@ async fn main() {
Some('#') | Some('+') => { Some('#') | Some('+') => {
tasks.add_tag(arg.to_string()); tasks.add_tag(arg.to_string());
info!("Added tag filter for #{arg}")
} }
Some('-') => { Some('-') => {
tasks.remove_tag(arg.to_string()); tasks.remove_tag(arg.to_string());
info!("Removed tag filter for #{arg}")
} }
Some('*') => { Some('*') => {
@ -436,7 +442,7 @@ async fn main() {
fn print_event(event: &Event) { fn print_event(event: &Event) {
debug!( debug!(
"At {} found {} kind {} '{}' {:?}", "At {} found {} kind {} \"{}\" {:?}",
event.created_at, event.id, event.kind, event.content, event.tags event.created_at, event.id, event.kind, event.content, event.tags
); );
} }

View File

@ -9,6 +9,7 @@ use log::{debug, error, info, trace, warn};
use nostr_sdk::{Alphabet, Event, EventBuilder, EventId, Kind, Tag, TagStandard, Timestamp}; use nostr_sdk::{Alphabet, Event, EventBuilder, EventId, Kind, Tag, TagStandard, Timestamp};
use crate::kinds::is_hashtag; use crate::kinds::is_hashtag;
use crate::some_non_empty;
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub(crate) struct Task { pub(crate) struct Task {
@ -62,7 +63,7 @@ impl Task {
fn states(&self) -> impl Iterator<Item=TaskState> + '_ { fn states(&self) -> impl Iterator<Item=TaskState> + '_ {
self.props.iter().filter_map(|event| { self.props.iter().filter_map(|event| {
event.kind.try_into().ok().map(|s| TaskState { 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, state: s,
time: event.created_at.clone(), time: event.created_at.clone(),
}) })
@ -117,7 +118,7 @@ impl Task {
"{:?}", "{:?}",
self.props self.props
.iter() .iter()
.map(|e| format!("{} kind {} '{}'", e.created_at, e.kind, e.content)) .map(|e| format!("{} kind {} \"{}\"", e.created_at, e.kind, e.content))
.collect::<Vec<String>>() .collect::<Vec<String>>()
)), )),
"descriptions" => Some(format!( "descriptions" => Some(format!(
@ -138,12 +139,14 @@ pub(crate) struct TaskState {
pub(crate) time: Timestamp, pub(crate) time: Timestamp,
} }
impl TaskState { 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 { pub(crate) fn get_label(&self) -> String {
self.name.clone().unwrap_or_else(|| self.state.to_string()) self.name.clone().unwrap_or_else(|| self.state.to_string())
} }
pub(crate) fn matches_label(&self, label: &str) -> bool { 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) || self.state.to_string().eq_ignore_ascii_case(label)
} }
} }

View File

@ -13,7 +13,7 @@ use TagStandard::Hashtag;
use crate::EventSender; use crate::EventSender;
use crate::kinds::*; use crate::kinds::*;
use crate::task::{State, Task}; use crate::task::{State, Task, TaskState};
type TaskMap = HashMap<EventId, Task>; type TaskMap = HashMap<EventId, Task>;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -550,9 +550,12 @@ impl Tasks {
} }
pub(crate) fn undo(&mut self) { pub(crate) fn undo(&mut self) {
let mut count = 0;
self.sender.clear().into_iter().rev().for_each(|event| { self.sender.clear().into_iter().rev().for_each(|event| {
count += 1;
self.remove(&event) self.remove(&event)
}); });
info!("Reverted last {count} actions!")
} }
fn remove(&mut self, event: &Event) { fn remove(&mut self, event: &Event) {
@ -572,6 +575,7 @@ impl Tasks {
comment, comment,
id, id,
); );
info!("Task status {} set for \"{}\"", TaskState::get_label_for(&state, comment), self.get_task_title(&id));
self.submit(prop) self.submit(prop)
} }
@ -582,7 +586,7 @@ impl Tasks {
pub(crate) fn make_note(&mut self, note: &str) { pub(crate) fn make_note(&mut self, note: &str) {
match self.position { match self.position {
None => warn!("Cannot add note '{}' without active task", note), None => warn!("Cannot add note \"{}\" without active task", note),
Some(id) => { Some(id) => {
let prop = self.build_prop(Kind::TextNote, note, id); let prop = self.build_prop(Kind::TextNote, note, id);
self.submit(prop); self.submit(prop);