use std::path::PathBuf;
use anyhow::Result;
use structopt::StructOpt;
pub(crate) mod command;
pub(crate) mod config;
pub(crate) mod ops;
use command::contains::ContainsCommand;
use command::find::FindCommand;
use command::replace::ReplaceCommand;
use command::walk::WalkCommand;
use command::Command;
use config::Config;
#[derive(StructOpt, Debug)]
#[structopt(about = "Recursive directory traversal file management tool")]
enum Recurse {
#[structopt(about = "Test for string in text files")]
Contains {
#[structopt(short = "e", long = "ext", help = "File extension filter")]
extension: Option<String>,
#[structopt(short = "a", long = "all", help = "Include hidden files")]
hidden: bool,
#[structopt(long = "mindepth", help = "Minimum directory depth")]
mindepth: Option<usize>,
#[structopt(long = "maxdepth", help = "Maximum directory depth")]
maxdepth: Option<usize>,
#[structopt(long = "symlinks", help = "Follow symbolic links")]
symlinks: bool,
#[structopt(help = "Find regular expression pattern")]
find: String,
#[structopt(parse(from_os_str), help = "Traversal start path")]
inpath: PathBuf,
},
#[structopt(about = "Find strings in text files")]
Find {
#[structopt(short = "e", long = "ext", help = "File extension filter")]
extension: Option<String>,
#[structopt(short = "a", long = "all", help = "Include hidden files")]
hidden: bool,
#[structopt(long = "mindepth", help = "Minimum directory depth")]
mindepth: Option<usize>,
#[structopt(long = "maxdepth", help = "Maximum directory depth")]
maxdepth: Option<usize>,
#[structopt(long = "symlinks", help = "Follow symbolic links")]
symlinks: bool,
#[structopt(help = "Find regular expression pattern")]
find: String,
#[structopt(parse(from_os_str), help = "Traversal start path")]
inpath: PathBuf,
},
#[structopt(about = "Replace strings in text files")]
Replace {
#[structopt(short = "e", long = "ext", help = "File extension filter")]
extension: Option<String>,
#[structopt(short = "a", long = "all", help = "Include hidden files")]
hidden: bool,
#[structopt(long = "nobu", help = "Write inplace without backup")]
nobu: bool,
#[structopt(long = "mindepth", help = "Minimum directory depth")]
mindepth: Option<usize>,
#[structopt(long = "maxdepth", help = "Maximum directory depth")]
maxdepth: Option<usize>,
#[structopt(long = "symlinks", help = "Follow symbolic links")]
symlinks: bool,
#[structopt(short = "f", long = "find", help = "Find regular expression pattern")]
find: String,
#[structopt(short = "r", long = "replace", help = "Replace string")]
replace: String,
#[structopt(parse(from_os_str), help = "Traversal start path")]
inpath: PathBuf,
},
#[structopt(about = "Walk the directory structure for paths")]
Walk {
#[structopt(short = "e", long = "ext", help = "File path extension filter")]
extension: Option<String>,
#[structopt(short = "d", long = "dir", help = "Include directory paths only")]
dir_only: bool,
#[structopt(short = "a", long = "all", help = "Include hidden paths")]
hidden: bool,
#[structopt(parse(from_os_str), help = "Traversal start path")]
inpath: PathBuf,
#[structopt(long = "mindepth", help = "Minimum directory depth")]
mindepth: Option<usize>,
#[structopt(long = "maxdepth", help = "Maximum directory depth")]
maxdepth: Option<usize>,
#[structopt(long = "symlinks", help = "Follow symbolic links")]
symlinks: bool,
},
}
pub fn run() -> Result<()> {
let config = Config::new(Recurse::from_args());
match &config.subcmd {
Recurse::Contains { .. } => {
return ContainsCommand::execute(config.subcmd, &mut std::io::stdout())
}
Recurse::Find { .. } => return FindCommand::execute(config.subcmd, &mut std::io::stdout()),
Recurse::Replace { .. } => {
return ReplaceCommand::execute(config.subcmd, &mut std::io::stdout())
}
Recurse::Walk { .. } => return WalkCommand::execute(config.subcmd, &mut std::io::stdout()),
}
}