diff options
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/r2md-remove.rs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/bin/r2md-remove.rs b/src/bin/r2md-remove.rs new file mode 100644 index 0000000..0835668 --- /dev/null +++ b/src/bin/r2md-remove.rs @@ -0,0 +1,97 @@ +use std::{io, path::PathBuf}; + +use clap::Parser; +use repo2markdown::{normalizer::Normalizer, path_list_editor::remove_paths}; + +/// Remove paths from a null-separated file list from stdin. +#[derive(Debug, Parser)] +#[command(version, about, long_about = None)] +struct Cli { + /// Base path used to resolve relative input paths and removal paths. + #[arg(long, default_value = ".")] + origin: PathBuf, + + /// Paths to remove from the input sequence. + paths: Vec<PathBuf>, +} + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let cli = Cli::parse(); + + let normalizer = Normalizer::new(&cli.origin, &cli.origin)?; + + remove_paths( + io::stdin().lock(), + io::stdout().lock(), + &cli.paths, + &normalizer, + ) +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use clap::Parser; + + use super::Cli; + + #[test] + fn defaults_origin_to_current_directory() { + let cli = Cli::try_parse_from(["r2md-remove"]).unwrap(); + + assert_eq!(cli.origin, PathBuf::from(".")); + } + + #[test] + fn accepts_origin() { + let cli = + Cli::try_parse_from(["r2md-remove", "--origin", "/repo", "src/generated.rs"]).unwrap(); + + assert_eq!(cli.origin, PathBuf::from("/repo")); + assert_eq!(cli.paths, vec![PathBuf::from("src/generated.rs")]); + } + + #[test] + fn accepts_no_paths() { + let cli = Cli::try_parse_from(["r2md-remove"]).unwrap(); + + assert_eq!(cli.paths, Vec::<PathBuf>::new()); + } + + #[test] + fn accepts_one_path() { + let cli = Cli::try_parse_from(["r2md-remove", "README.md"]).unwrap(); + + assert_eq!(cli.paths, vec![PathBuf::from("README.md")]); + } + + #[test] + fn accepts_multiple_paths() { + let cli = Cli::try_parse_from(["r2md-remove", "README.md", "src/main.rs"]).unwrap(); + + assert_eq!( + cli.paths, + vec![PathBuf::from("README.md"), PathBuf::from("src/main.rs")] + ); + } + + #[test] + fn treats_arguments_after_double_dash_as_paths() { + let cli = Cli::try_parse_from([ + "r2md-remove", + "--", + "--filename-that-looks-like-an-option", + "main.rs", + ]) + .unwrap(); + + assert_eq!( + cli.paths, + vec![ + PathBuf::from("--filename-that-looks-like-an-option"), + PathBuf::from("main.rs") + ] + ); + } +} |
