argwerk::define! {
#[usage = "remove"]
struct Remove {
help: bool,
}
["-h" | "--help"] => {
println!("{}", HELP);
help = true;
}
}
argwerk::define! {
#[usage = "add"]
struct Add {
args: Vec<String>,
help: bool,
}
["-h" | "--help"] => {
println!("{}", HELP);
help = true;
}
[arg] => {
args.push(arg);
}
}
#[derive(Debug)]
enum Command {
Remove(Remove),
Add(Add),
}
argwerk::define! {
#[usage = "tour [-h]"]
struct Args {
help: bool,
#[required = "must use a subcommand"]
command: Command,
}
["-h" | "--help"] => {
println!("{}", HELP);
help = true;
}
["rm", #[rest(os)] args] if command.is_none() => {
command = Some(Command::Remove(Remove::parse(args)?));
}
["add", #[rest(os)] args] if command.is_none() => {
command = Some(Command::Add(Add::parse(args)?));
}
}
fn main() -> anyhow::Result<()> {
let args = Args::args()?;
if args.help {
return Ok(());
}
match args.command {
Command::Add(add) => {
if add.help {
return Ok(());
}
println!("Adding: {:?}", add);
}
Command::Remove(rm) => {
if rm.help {
return Ok(());
}
println!("Removing: {:?}", rm);
}
}
Ok(())
}