From: Ian Jackson Date: Sat, 8 Aug 2020 11:33:20 +0000 (+0100) Subject: subcommands X-Git-Tag: otter-0.2.0~1163 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=cf97bcadd86df7d0e3f3509a467a37cf0fb598c1;p=otter.git subcommands --- diff --git a/src/bin/otter.rs b/src/bin/otter.rs index a898ec4a..19d18ef2 100644 --- a/src/bin/otter.rs +++ b/src/bin/otter.rs @@ -91,24 +91,39 @@ impl<'x, T, F: FnMut(&str) -> Result> struct MainOpts { scope: Option, } - +/* //#[derive(Debug,StructOpt)] enum Subcommand { CreateTable { } -} +}*/ + +struct Subcommand ( + &'static str, + fn(MainOpts, &[String]), +); +inventory::collect!(Subcommand); + +inventory::submit!{Subcommand( + "create-table", |mainopts, args|{ + eprintln!("CREATE-TABLE {:?} {:?}", &mainopts, &args); + } +)} fn main() { - let mainopts = (||{ + let pa = (||{ let mut mainopts : MainOpts = Default::default(); - let mut args : Vec = vec![]; + let mut subcommand = String::new(); + let mut subargs : Vec = vec![]; use argparse::*; let mut ap = ArgumentParser::new(); ap.stop_on_first_argument(true); ap.silence_double_dash(true); - ap.refer(&mut args).add_argument("subcommand",Collect, - "subcommand and argueents"); + ap.refer(&mut subcommand).add_argument("subcommand",Store, + "subcommand"); + ap.refer(&mut subargs).add_argument("...",Collect, + "subcommand options/argueents"); let mut scope = ap.refer(&mut mainopts.scope); scope.add_option(&["--scope-server"], @@ -134,12 +149,23 @@ fn main() { }); ManagementScope::Unix { user } }); - >::Ok((mainopts, args)) + >::Ok((mainopts, subcommand, subargs)) /* Cell::from_mut(&mut mainopts.scope); let opts = MainOpts::from_args(); */ })().unwrap_or_else(|rc| exit(if rc!=0 { 12 } else { 0 })); - println!("{:?}", &mainopts); + + for _ in inventory::iter:: { } + + let Subcommand(_,call) = inventory::iter::.into_iter() + .filter(|Subcommand(found,_)| found == &pa.1) + .next() + .unwrap_or_else(||{ + eprintln!("subcommand `{}' not recognised", &pa.1); + exit(12); + }); + + call(pa.0, &pa.2); }