diff --git a/src/cli.rs b/src/cli.rs index fb498bc..5053962 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -5,9 +5,10 @@ use std::net::Shutdown; use std::os::unix::net::UnixStream; use std::time::Duration; -#[derive(Parser)] +#[derive(Debug, Parser)] #[command(name = "timers")] -/// A advanced timer daemon/cli. +#[command(about = "A advanced timer daemon/cli.", long_about = None)] +#[command(arg_required_else_help = true)] pub struct Cli { #[command(subcommand)] pub command: Command, @@ -18,67 +19,35 @@ pub struct Cli { #[derive(Debug, Subcommand)] pub enum Command { - /// Run as daemon - #[clap(visible_alias="d")] Daemon { - /// do not send notifications #[arg(short, long)] - no_notify: bool, + notify: bool, }, - /// Add a timer - #[clap(visible_alias="a")] Add { - /// name of the timer name: String, - /// duration of the timer duration: humantime::Duration, }, - /// List timers - #[clap(visible_alias="l")] List, - /// Remove a timer - #[clap(visible_alias="r")] Remove { - /// name of the timer to remove name: String, }, - /// Pomodoro specific command #[command(subcommand)] - #[clap(visible_alias="p")] Pomodoro(PomodoroCommand) } #[derive(Debug, Subcommand)] pub enum PomodoroCommand { - /// Start pomodoro - #[clap(visible_alias="s")] Start { - /// duration to work for - #[arg(long)] #[clap(default_value_t = Duration::from_secs(25 * 60).into())] work: humantime::Duration, - - /// duration for short pauses - #[arg(long)] #[clap(default_value_t = Duration::from_secs(5 * 60).into())] pause: humantime::Duration, - - /// duration for long pauses - #[arg(long)] #[clap(default_value_t = Duration::from_secs(10 * 60).into())] long_pause: humantime::Duration, - - /// number of short pauses till long pause - #[arg(long)] #[clap(default_value_t = 3)] pauses_till_long: u64, }, - /// Stop the pomodoro - #[clap(visible_alias="p")] - Remove, - /// List the pomodoro settings and remaining duration - #[clap(visible_alias="l")] - List, + Stop, } fn get_stream(socket_path: &String) -> Result { diff --git a/src/daemon.rs b/src/daemon.rs index 41fa1cd..95b6962 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -22,34 +22,33 @@ pub enum Command { long_pause: Duration, pauses_till_long: u64, }, - PomodoroRemove, - PomodoroList, + PomodoroStop } #[derive(Debug, Serialize, Deserialize)] pub enum Answer { Ok, - Timers(Vec), - Pomodoro(Option), + Timers(Vec, Option), } impl Display for Answer { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { match self { Answer::Ok => write!(f, "Ok"), - Answer::Timers(timers) => { + Answer::Timers(timers, pomodoro) => { if timers.is_empty() { - writeln!(f, "No timers running.") + writeln!(f, "No timers running.")?; } else { let strings: Vec = timers.iter().map(|timer| timer.to_string()).collect(); - writeln!(f, "{}", strings.join("\n")) + writeln!(f, "{}", strings.join("\n"))?; + }; + + match pomodoro { + Some(p) => write!(f, "{}", p), + None => write!(f, "No pomodoro running."), } } - Answer::Pomodoro(pomodoro) => match pomodoro { - Some(p) => write!(f, "{}", p), - None => write!(f, "No pomodoro running."), - }, } } } @@ -70,7 +69,7 @@ pub struct Daemon { } impl Daemon { - pub fn new(socket_path: String, no_notify: bool) -> anyhow::Result { + pub fn new(socket_path: String, notify: bool) -> anyhow::Result { let path = std::path::Path::new(&socket_path); if path.exists() { std::fs::remove_file(path) @@ -82,7 +81,7 @@ impl Daemon { listener, timers: Vec::new(), pomodoro: None, - notify: !no_notify, + notify, }) } @@ -93,7 +92,7 @@ impl Daemon { fn handle_command(&mut self, command: Command) -> Result { println!("Received command {:?}", command); match command { - Command::List => Ok(Answer::Timers(self.timers.clone())), + Command::List => Ok(Answer::Timers(self.timers.clone(), self.pomodoro.clone())), Command::Add(name, duration) => { if self.has_timer(&name) { return Err(AnswerErr::TimerAlreadyExist(name)); @@ -146,11 +145,10 @@ impl Daemon { self.pomodoro = Some(Pomodoro::new(work, pause, long_pause, pauses_till_long)); Ok(Answer::Ok) } - Command::PomodoroRemove => { + Command::PomodoroStop => { self.pomodoro = None; Ok(Answer::Ok) - } - Command::PomodoroList => Ok(Answer::Pomodoro(self.pomodoro.clone())), + }, } } diff --git a/src/main.rs b/src/main.rs index 72bfe2d..4e81bdd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,7 @@ use cli::PomodoroCommand; fn main() -> Result<()> { let args = Cli::parse(); let daemon_command = match args.command { - CliCommand::Daemon { no_notify } => return Daemon::new(args.socket, no_notify)?.run(), + CliCommand::Daemon { notify } => return Daemon::new(args.socket, notify)?.run(), CliCommand::Add { name, duration } => { DaemonCommand::Add(name.into_boxed_str(), duration.into()) } @@ -30,8 +30,7 @@ fn main() -> Result<()> { long_pause: long_pause.into(), pauses_till_long, }, - PomodoroCommand::Remove => DaemonCommand::PomodoroRemove, - PomodoroCommand::List => DaemonCommand::PomodoroList, + PomodoroCommand::Stop => DaemonCommand::PomodoroStop, }, }; send_command(&args.socket, daemon_command) diff --git a/src/pomodoro.rs b/src/pomodoro.rs index 1bc2929..da78e06 100644 --- a/src/pomodoro.rs +++ b/src/pomodoro.rs @@ -39,9 +39,9 @@ enum Status { impl Display for Status { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Status::Working => write!(f, "work"), - Status::Pausing => write!(f, "pause"), - Status::LongPause => write!(f, "long pause"), + Status::Working => write!(f, "pomodoro work"), + Status::Pausing => write!(f, "pomodoro pause"), + Status::LongPause => write!(f, "pomodoro long pause"), } } } @@ -78,13 +78,8 @@ impl Pomodoro { }; self.status = match self.status { Status::Working => { - if self.pauses == self.pauses_till_long { - self.pauses = 0; - Status::LongPause - } else { - self.pauses += 1; - Status::Pausing - } + self.pauses += 1; + Status::Pausing } _ => Status::Working, };