From: Ian Jackson Date: Sun, 9 Aug 2020 09:12:39 +0000 (+0100) Subject: closure attempt X-Git-Tag: otter-0.2.0~1158 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e096990c3bb89ff51a949f6f018f28ad0f435271;p=otter.git closure attempt --- diff --git a/src/bin/otter.rs b/src/bin/otter.rs index e7b210e8..016f8c81 100644 --- a/src/bin/otter.rs +++ b/src/bin/otter.rs @@ -105,33 +105,43 @@ inventory::submit!{Subcommand( )} fn main() { - let mut mainopts : MainOpts = Default::default(); - let mut subcommand = String::new(); - let mut subargs : Vec = vec![]; use argparse::*; + let mut parsed = Default::default(); + let apmaker : + for<'output, 'parser> + fn(&'parser mut ArgumentParser, + &'output mut (MainOpts, String, Vec)) -> () + where 'output : 'parser + = | ap: &/*'parser*/ mut ArgumentParser, + (mainopts, subcommand, subargs): + &/*'output*/ mut (MainOpts, String, Vec)| { + ap.stop_on_first_argument(true); + ap.silence_double_dash(true); + ap.refer(subcommand).add_argument("subcommand",Store, + "subcommand"); + ap.refer(subargs).add_argument("...",Collect, + "subcommand options/argueents"); + + let mut scope = ap.refer(&mut mainopts.scope); + scope.add_option(&["--scope-server"], + StoreConst(Some(ManagementScope::Server)), + "use Server scope"); + scope.add_option(&["--scope-unix-user"], + MapStore(|user| Ok(Some(ManagementScope::Unix { + user: user.into() + }))), + "use specified unix user scope"); + scope.add_option(&["--scope-unix"], + StoreConst(None), + "use USER scope"); + }; let mut ap = ArgumentParser::new(); - ap.stop_on_first_argument(true); - ap.silence_double_dash(true); - 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"], - StoreConst(Some(ManagementScope::Server)), - "use Server scope"); - scope.add_option(&["--scope-unix-user"], - MapStore(|user| Ok(Some(ManagementScope::Unix { - user: user.into() - }))), - "use specified unix user scope"); - scope.add_option(&["--scope-unix"], - StoreConst(None), - "use USER scope"); + apmaker(&mut ap, &mut parsed); ap.parse_args().unwrap_or_else(|rc| exit(if rc!=0 { EXIT_USAGE } else { 0 })); + let (mut mainopts, subcommand, subargs) = parsed; + mem::drop(ap); mainopts.scope.get_or_insert_with(||{ let user = env::var("USER").unwrap_or_else(|e|{