diff --git a/Cargo.lock b/Cargo.lock index c79cb13..ab13b36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,6 +78,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + [[package]] name = "autocfg" version = "1.3.0" @@ -202,6 +208,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +[[package]] +name = "clap_mangen" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dd95b5ebb5c1c54581dd6346f3ed6a79a3eef95dd372fc2ac13d535535300e" +dependencies = [ + "clap", + "roff", +] + [[package]] name = "colorchoice" version = "1.0.1" @@ -509,9 +525,11 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" name = "rens-cli" version = "0.0.0" dependencies = [ + "anyhow", "clap", "clap-verbosity-flag", "clap_complete_command", + "clap_mangen", "dunce", "env_logger", "log", @@ -542,6 +560,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "roff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" + [[package]] name = "rustversion" version = "1.0.17" diff --git a/rens-cli/Cargo.toml b/rens-cli/Cargo.toml index ebfa089..421c4c3 100644 --- a/rens-cli/Cargo.toml +++ b/rens-cli/Cargo.toml @@ -5,9 +5,11 @@ edition = "2021" rust-version = "1.75.0" [dependencies] -clap = { version = "4.5.4", features = ["derive"] } +anyhow = "1.0.86" +clap = { version = "4.5.4", features = ["derive", "string"] } clap-verbosity-flag = "2.2.0" clap_complete_command = "0.5.1" +clap_mangen = "0.2.20" dunce = "1.0.4" env_logger = "0.11.3" log = "0.4.21" diff --git a/rens-cli/src/cli.rs b/rens-cli/src/cli.rs index f946c98..15957a3 100644 --- a/rens-cli/src/cli.rs +++ b/rens-cli/src/cli.rs @@ -1,9 +1,11 @@ /* Modules */ pub mod renaming; +/* Built-in imports */ +use std::path::PathBuf; /* Crate imports */ use renaming::Mode; /* Dependencies */ -use clap::{Parser, Subcommand}; +use clap::{Parser, Subcommand, ValueHint}; use clap_verbosity_flag::Verbosity; #[derive(Debug, Parser)] @@ -25,6 +27,14 @@ pub enum Commands { /// The shell to generate the completions for shell: clap_complete_command::Shell, }, + /// Generate man page + Man { + /// The dir path to generate man-pages to. + /// + /// Note: Will get created if doesn't exist. + #[arg(value_hint = ValueHint::DirPath)] + path: PathBuf, + }, } #[cfg(test)] diff --git a/rens-cli/src/main.rs b/rens-cli/src/main.rs index 70d678d..98ec0eb 100644 --- a/rens-cli/src/main.rs +++ b/rens-cli/src/main.rs @@ -3,7 +3,7 @@ mod cli; mod utils; /* Built-in imports */ -use std::io; +use std::{fs, io}; /* Crate imports */ use cli::{ renaming::{ConfirmOption, Options}, @@ -19,7 +19,8 @@ use rens_common::{ }; use tap::{Pipe, Tap}; -fn main() { +#[allow(clippy::too_many_lines)] +fn main() -> anyhow::Result<()> { let Cli { command, verbose: _, @@ -34,6 +35,21 @@ fn main() { Commands::Completions { shell } => { shell.generate(&mut Cli::command(), &mut io::stdout()); }, + Commands::Man { path } => { + let command = Cli::command(); + if !path.exists() { + fs::create_dir_all(&path)?; + } + + for subcommand in command.get_subcommands() { + let subcommand_filename = + format!("{}-{}", command.get_name(), subcommand.get_name()); + let cmd = subcommand.clone().name(subcommand_filename); + clap_mangen::Man::new(cmd).generate_to(&path)?; + } + + clap_mangen::Man::new(command).generate_to(path)?; + }, Commands::Renaming(mode) => { let ( strategy, @@ -101,7 +117,8 @@ fn main() { if confirmations.confirm == ConfirmOption::Once && !ask_for_confirm("All good ?") { - return println!("Canceled..."); + println!("Canceled..."); + return Ok(()); } files @@ -119,4 +136,6 @@ fn main() { .for_each(|err| error!("{err}")); }, } + + Ok(()) }