diff --git a/Cargo.lock b/Cargo.lock index 0335743..1d674b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,6 +343,16 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +[[package]] +name = "clap_mangen" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8e5f34d85d9e0bbe2491d100a7a7c1007bb2467b518080bfe311e8947197a9" +dependencies = [ + "clap", + "roff", +] + [[package]] name = "colorchoice" version = "1.0.0" @@ -651,12 +661,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - [[package]] name = "libc" version = "0.2.147" @@ -954,6 +958,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +[[package]] +name = "roff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" + [[package]] name = "rustix" version = "0.37.20" @@ -981,17 +991,11 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - [[package]] name = "serde" -version = "1.0.179" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5bf42b8d227d4abf38a1ddb08602e229108a517cd4e5bb28f9c7eaafdce5c0" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] @@ -1008,26 +1012,15 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.179" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741e124f5485c7e60c03b043f79f320bff3527f4bbf12cf3831750dc46a0ec2c" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", "syn 2.0.27", ] -[[package]] -name = "serde_json" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" -dependencies = [ - "itoa", - "ryu", - "serde", -] - [[package]] name = "serde_repr" version = "0.1.16" @@ -1188,12 +1181,12 @@ dependencies = [ "anyhow", "clap", "clap_complete_command", + "clap_mangen", "humantime", "libc", "notify-rust", "serde", "serde_cbor", - "serde_json", "signal-hook", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index e8603cb..9d57901 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,11 +9,11 @@ edition = "2021" anyhow = "1.0.71" clap = { version = "4.3.4", features = ["derive"] } clap_complete_command = "0.5.1" +clap_mangen = "0.2.13" humantime = "2.1.0" libc = "0.2.147" notify-rust = "4.8.0" serde = { version = "1.0.164", features = ["derive"] } serde_cbor = "0.11.2" -serde_json = "1.0.105" signal-hook = "0.3.17" thiserror = "1.0.44" diff --git a/flake.lock b/flake.lock index 1f49d10..dea1ff1 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,14 @@ "nodes": { "naersk": { "inputs": { - "nixpkgs": [ - "nixpkgs" - ] + "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1692351612, - "narHash": "sha256-KTGonidcdaLadRnv9KFgwSMh1ZbXoR/OBmPjeNMhFwU=", + "lastModified": 1686572087, + "narHash": "sha256-jXTut7ZSYqLEgm/nTk7TuVL2ExahTip605bLINklAnQ=", "owner": "nix-community", "repo": "naersk", - "rev": "78789c30d64dea2396c9da516bbcc8db3a475207", + "rev": "8507af04eb40c5520bd35d9ce6f9d2342cea5ad1", "type": "github" }, "original": { @@ -23,11 +21,24 @@ }, "nixpkgs": { "locked": { - "lastModified": 1692934111, - "narHash": "sha256-9EEE59v/esKNMR5zKbLRV9NoRPYvERw5jHQOnfr47bk=", + "lastModified": 1685677062, + "narHash": "sha256-zoHF7+HNwNwne2XEomphbdc4Y8tdWT16EUxUTXpOKpQ=", + "path": "/nix/store/dnqwkazyg92hzya7400klxlk072g3zsk-source", + "rev": "95be94370d09f97f6af6a1df1eb9649b5260724e", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687103638, + "narHash": "sha256-dwy/TK6Db5W7ivcgmcxUykhFwodIg0jrRzOFt7H5NUc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1e44a037bbf4fcaba041436e65e87be88f3f495b", + "rev": "91430887645a0953568da2f3e9a3a3bb0a0378ac", "type": "github" }, "original": { @@ -40,7 +51,7 @@ "root": { "inputs": { "naersk": "naersk", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "utils": "utils" } }, @@ -64,11 +75,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "lastModified": 1687171271, + "narHash": "sha256-BJlq+ozK2B1sJDQXS3tzJM5a+oVZmi1q0FlBK/Xqv7M=", "owner": "numtide", "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "rev": "abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 1e4f204..c399655 100644 --- a/flake.nix +++ b/flake.nix @@ -1,9 +1,8 @@ { inputs = { + naersk.url = "github:nix-community/naersk/master"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; utils.url = "github:numtide/flake-utils"; - naersk.url = "github:nix-community/naersk/master"; - naersk.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { self, nixpkgs, utils, naersk }: @@ -18,6 +17,9 @@ nativeBuildInputs = with pkgs; [ installShellFiles ]; meta.mainProgram = "timers"; postInstall = '' + $out/bin/timers manpage timers.1 + installManPage timers.1 + installShellCompletion --cmd timers \ --bash <($out/bin/timers completions bash) \ --fish <($out/bin/timers completions fish) \ diff --git a/src/cli.rs b/src/cli.rs index 549024c..f71c642 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -12,13 +12,9 @@ use std::time::Duration; pub struct Cli { #[command(subcommand)] pub command: Command, - #[arg(short, long)] #[clap(default_value_t = format!("{}/timers.socket", run_path()))] pub socket: String, - - #[arg(long)] - pub json: bool } #[derive(Debug, Subcommand)] @@ -65,6 +61,12 @@ pub enum Command { Completions { #[arg(value_enum)] shell: clap_complete_command::Shell, + }, + + /// Generate man page (section 1) + Manpage { + /// File to save the man page to + file_path: String } } diff --git a/src/main.rs b/src/main.rs index 07a5b27..7c7d841 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use std::io::Write; mod cli; mod daemon; mod helper; @@ -46,12 +47,15 @@ fn main() -> Result<(), anyhow::Error> { shell.generate(&mut Cli::command(), &mut std::io::stdout()); return Ok(()); } + CliCommand::Manpage { file_path } => { + let man = clap_mangen::Man::new(Cli::command()); + let mut buffer: Vec = Default::default(); + man.render(&mut buffer)?; + std::fs::write(file_path, buffer)?; + return Ok(()); + } }; let answer = send_command(&args.socket, daemon_command)?; - if args.json { - println!("{}", serde_json::to_string(&answer)?) - } else { - print!("{}", answer); - }; + print!("{}", answer); Ok(()) } diff --git a/src/pomodoro.rs b/src/pomodoro.rs index 7831dda..8cd5103 100644 --- a/src/pomodoro.rs +++ b/src/pomodoro.rs @@ -19,11 +19,10 @@ impl Display for Pomodoro { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, - "Pomodoro ({}, {}, {}) currently {} {} with {} remaining.\n", + "Pomodoro ({}, {}, {}) currently {} with {} remaining.", humantime::format_duration(self.work), humantime::format_duration(self.pause), humantime::format_duration(self.long_pause), - self.timer.state, self.status, humantime::format_duration(self.timer.remaining()) ) diff --git a/src/timer.rs b/src/timer.rs index 4326023..af2ca46 100644 --- a/src/timer.rs +++ b/src/timer.rs @@ -11,7 +11,7 @@ pub struct Timer { #[serde(with = "approx_instant")] start: Instant, duration: Duration, - pub state: State, + state: State, } #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] @@ -20,16 +20,6 @@ pub enum State { Paused, } -impl Display for State { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - let string = match self { - State::Running => "running", - State::Paused => "paused", - }; - write!(f, "{}", string) - } -} - impl Timer { /// Create a new [`Timer`] with the supplied name and duration /// The timer is instantly started. @@ -82,16 +72,10 @@ impl Timer { impl Display for Timer { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { - let state_message = match self.state { - State::Running => "has", - State::Paused => "is paused and has", - }; - write!( f, - "'{}' {} {} remaining.", + "{} has {} remaining.", self.name, - state_message, humantime::format_duration(self.remaining()) ) } @@ -123,3 +107,4 @@ mod approx_instant { Ok(instant) } } +