Compare commits

..

4 commits

8 changed files with 74 additions and 70 deletions

51
Cargo.lock generated
View file

@ -343,16 +343,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" 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]] [[package]]
name = "colorchoice" name = "colorchoice"
version = "1.0.0" version = "1.0.0"
@ -661,6 +651,12 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "itoa"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.147" version = "0.2.147"
@ -958,12 +954,6 @@ version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
[[package]]
name = "roff"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.37.20" version = "0.37.20"
@ -992,10 +982,16 @@ dependencies = [
] ]
[[package]] [[package]]
name = "serde" name = "ryu"
version = "1.0.164" version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
[[package]]
name = "serde"
version = "1.0.179"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a5bf42b8d227d4abf38a1ddb08602e229108a517cd4e5bb28f9c7eaafdce5c0"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -1012,15 +1008,26 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.164" version = "1.0.179"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" checksum = "741e124f5485c7e60c03b043f79f320bff3527f4bbf12cf3831750dc46a0ec2c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "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]] [[package]]
name = "serde_repr" name = "serde_repr"
version = "0.1.16" version = "0.1.16"
@ -1181,12 +1188,12 @@ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
"clap_complete_command", "clap_complete_command",
"clap_mangen",
"humantime", "humantime",
"libc", "libc",
"notify-rust", "notify-rust",
"serde", "serde",
"serde_cbor", "serde_cbor",
"serde_json",
"signal-hook", "signal-hook",
"thiserror", "thiserror",
] ]

View file

@ -9,11 +9,11 @@ edition = "2021"
anyhow = "1.0.71" anyhow = "1.0.71"
clap = { version = "4.3.4", features = ["derive"] } clap = { version = "4.3.4", features = ["derive"] }
clap_complete_command = "0.5.1" clap_complete_command = "0.5.1"
clap_mangen = "0.2.13"
humantime = "2.1.0" humantime = "2.1.0"
libc = "0.2.147" libc = "0.2.147"
notify-rust = "4.8.0" notify-rust = "4.8.0"
serde = { version = "1.0.164", features = ["derive"] } serde = { version = "1.0.164", features = ["derive"] }
serde_cbor = "0.11.2" serde_cbor = "0.11.2"
serde_json = "1.0.105"
signal-hook = "0.3.17" signal-hook = "0.3.17"
thiserror = "1.0.44" thiserror = "1.0.44"

View file

@ -2,14 +2,16 @@
"nodes": { "nodes": {
"naersk": { "naersk": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs" "nixpkgs": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1686572087, "lastModified": 1692351612,
"narHash": "sha256-jXTut7ZSYqLEgm/nTk7TuVL2ExahTip605bLINklAnQ=", "narHash": "sha256-KTGonidcdaLadRnv9KFgwSMh1ZbXoR/OBmPjeNMhFwU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "naersk", "repo": "naersk",
"rev": "8507af04eb40c5520bd35d9ce6f9d2342cea5ad1", "rev": "78789c30d64dea2396c9da516bbcc8db3a475207",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -21,24 +23,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1685677062, "lastModified": 1692934111,
"narHash": "sha256-zoHF7+HNwNwne2XEomphbdc4Y8tdWT16EUxUTXpOKpQ=", "narHash": "sha256-9EEE59v/esKNMR5zKbLRV9NoRPYvERw5jHQOnfr47bk=",
"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", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "91430887645a0953568da2f3e9a3a3bb0a0378ac", "rev": "1e44a037bbf4fcaba041436e65e87be88f3f495b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -51,7 +40,7 @@
"root": { "root": {
"inputs": { "inputs": {
"naersk": "naersk", "naersk": "naersk",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs",
"utils": "utils" "utils": "utils"
} }
}, },
@ -75,11 +64,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1687171271, "lastModified": 1692799911,
"narHash": "sha256-BJlq+ozK2B1sJDQXS3tzJM5a+oVZmi1q0FlBK/Xqv7M=", "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c", "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -1,8 +1,9 @@
{ {
inputs = { inputs = {
naersk.url = "github:nix-community/naersk/master";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
utils.url = "github:numtide/flake-utils"; utils.url = "github:numtide/flake-utils";
naersk.url = "github:nix-community/naersk/master";
naersk.inputs.nixpkgs.follows = "nixpkgs";
}; };
outputs = { self, nixpkgs, utils, naersk }: outputs = { self, nixpkgs, utils, naersk }:
@ -17,9 +18,6 @@
nativeBuildInputs = with pkgs; [ installShellFiles ]; nativeBuildInputs = with pkgs; [ installShellFiles ];
meta.mainProgram = "timers"; meta.mainProgram = "timers";
postInstall = '' postInstall = ''
$out/bin/timers manpage timers.1
installManPage timers.1
installShellCompletion --cmd timers \ installShellCompletion --cmd timers \
--bash <($out/bin/timers completions bash) \ --bash <($out/bin/timers completions bash) \
--fish <($out/bin/timers completions fish) \ --fish <($out/bin/timers completions fish) \

View file

@ -12,9 +12,13 @@ use std::time::Duration;
pub struct Cli { pub struct Cli {
#[command(subcommand)] #[command(subcommand)]
pub command: Command, pub command: Command,
#[arg(short, long)] #[arg(short, long)]
#[clap(default_value_t = format!("{}/timers.socket", run_path()))] #[clap(default_value_t = format!("{}/timers.socket", run_path()))]
pub socket: String, pub socket: String,
#[arg(long)]
pub json: bool
} }
#[derive(Debug, Subcommand)] #[derive(Debug, Subcommand)]
@ -61,12 +65,6 @@ pub enum Command {
Completions { Completions {
#[arg(value_enum)] #[arg(value_enum)]
shell: clap_complete_command::Shell, shell: clap_complete_command::Shell,
},
/// Generate man page (section 1)
Manpage {
/// File to save the man page to
file_path: String
} }
} }

View file

@ -1,4 +1,3 @@
use std::io::Write;
mod cli; mod cli;
mod daemon; mod daemon;
mod helper; mod helper;
@ -47,15 +46,12 @@ fn main() -> Result<(), anyhow::Error> {
shell.generate(&mut Cli::command(), &mut std::io::stdout()); shell.generate(&mut Cli::command(), &mut std::io::stdout());
return Ok(()); return Ok(());
} }
CliCommand::Manpage { file_path } => {
let man = clap_mangen::Man::new(Cli::command());
let mut buffer: Vec<u8> = Default::default();
man.render(&mut buffer)?;
std::fs::write(file_path, buffer)?;
return Ok(());
}
}; };
let answer = send_command(&args.socket, daemon_command)?; let answer = send_command(&args.socket, daemon_command)?;
print!("{}", answer); if args.json {
println!("{}", serde_json::to_string(&answer)?)
} else {
print!("{}", answer);
};
Ok(()) Ok(())
} }

View file

@ -19,10 +19,11 @@ impl Display for Pomodoro {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!( write!(
f, f,
"Pomodoro ({}, {}, {}) currently {} with {} remaining.", "Pomodoro ({}, {}, {}) currently {} {} with {} remaining.\n",
humantime::format_duration(self.work), humantime::format_duration(self.work),
humantime::format_duration(self.pause), humantime::format_duration(self.pause),
humantime::format_duration(self.long_pause), humantime::format_duration(self.long_pause),
self.timer.state,
self.status, self.status,
humantime::format_duration(self.timer.remaining()) humantime::format_duration(self.timer.remaining())
) )

View file

@ -11,7 +11,7 @@ pub struct Timer {
#[serde(with = "approx_instant")] #[serde(with = "approx_instant")]
start: Instant, start: Instant,
duration: Duration, duration: Duration,
state: State, pub state: State,
} }
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
@ -20,6 +20,16 @@ pub enum State {
Paused, 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 { impl Timer {
/// Create a new [`Timer`] with the supplied name and duration /// Create a new [`Timer`] with the supplied name and duration
/// The timer is instantly started. /// The timer is instantly started.
@ -72,10 +82,16 @@ impl Timer {
impl Display for Timer { impl Display for Timer {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { 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!( write!(
f, f,
"{} has {} remaining.", "'{}' {} {} remaining.",
self.name, self.name,
state_message,
humantime::format_duration(self.remaining()) humantime::format_duration(self.remaining())
) )
} }
@ -107,4 +123,3 @@ mod approx_instant {
Ok(instant) Ok(instant)
} }
} }