From: Ian Jackson Date: Sun, 6 Jun 2021 23:54:14 +0000 (+0100) Subject: otter cli: Move ArgumentParser out of RawArgParserContext X-Git-Tag: otter-0.7.0~57 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=8b1932efdc955cc476e2a387c9c3ca247fa1318d;p=otter.git otter cli: Move ArgumentParser out of RawArgParserContext We need to work with different ones. Signed-off-by: Ian Jackson --- diff --git a/cli/clisupport.rs b/cli/clisupport.rs index b0ec1ee1..856a4913 100644 --- a/cli/clisupport.rs +++ b/cli/clisupport.rs @@ -127,19 +127,15 @@ pub type ExtraMessage<'exh> = pub type ApCompleter<'apc,T,U> = &'apc dyn Fn(T) -> Result; -pub struct RawArgParserContext<'a> { - pub ap: ArgumentParser<'a>, +pub struct RawArgParserContext { pub us: String, pub stdout: CookedStdout, pub stderr: io::Stderr, } -impl<'a> RawArgParserContext<'a> { - pub fn new(args0: &[String], parsed: &'a mut T, apmaker: ApMaker) - -> Self - { +impl RawArgParserContext { + pub fn new(args0: &[String]) -> Self { RawArgParserContext { - ap: apmaker(parsed), us: args0.get(0).expect("argv[0] must be provided!").clone(), stdout: CookedStdout::new(), stderr: io::stderr(), @@ -147,6 +143,7 @@ impl<'a> RawArgParserContext<'a> { } pub fn run(&mut self, + ap: &mut ArgumentParser<'_>, args: Vec, extra_help: Option, extra_error: Option) { @@ -154,7 +151,7 @@ impl<'a> RawArgParserContext<'a> { if let Some(em) = em { em(f).unwrap() }; }; - let r = self.ap.parse(args, &mut self.stdout, &mut self.stderr); + let r = ap.parse(args, &mut self.stdout, &mut self.stderr); if let Err(rc) = r { exit(match rc { 0 => { @@ -189,9 +186,11 @@ pub fn parse_args( extra_help: Option, ) -> U { let mut parsed = default(); - let mut rapc = RawArgParserContext::new(&args, &mut parsed, apmaker); - rapc.run(args, extra_help, None); + let mut rapc = RawArgParserContext::new(&args); + let mut ap = apmaker(&mut parsed); + rapc.run(&mut ap, args, extra_help, None); let us = rapc.done(); + drop(ap); let completed = argparse_more(us, apmaker, || completer(parsed)); completed } diff --git a/cli/otter.rs b/cli/otter.rs index b3d6383c..846a2d6e 100644 --- a/cli/otter.rs +++ b/cli/otter.rs @@ -332,9 +332,11 @@ fn main() { let mut parsed: RawMainArgs = default(); let args: Vec = env::args().collect(); - let mut rapc = RawArgParserContext::new(&args, &mut parsed, apmaker); - rapc.run(args.clone(), Some(extra_help), None); + let mut rapc = RawArgParserContext::new(&args); + let mut ap = apmaker(&mut parsed); + rapc.run(&mut ap, args.clone(), Some(extra_help), None); let us = rapc.done(); + drop(ap); argparse_more(us.clone(), apmaker, || (||{ let prefs_path: PathBuf = parsed.prefs_path.as_ref() @@ -372,7 +374,8 @@ fn main() { if_let!{ Some(data) = data; else return Ok(()); } let mut redo: RawMainArgs = default(); - let mut rapc = RawArgParserContext::new(&args, &mut redo, apmaker); + let mut rapc = RawArgParserContext::new(&args); + let mut ap = apmaker(&mut redo); for (k, v) in &data.options { let context = || format!( @@ -392,15 +395,15 @@ fn main() { }; let synth_args = vec![synth_arg.clone()]; - rapc.run(synth_args, None, Some(&|stderr: &mut dyn Write|{ + rapc.run(&mut ap, synth_args, None, Some(&|stderr: &mut dyn Write|{ writeln!(stderr, "Error processing {}\n\ Prefs option interpreted as {}", context(), &synth_arg) })); } - rapc.run(args.clone(), Some(extra_help), None); - rapc.done(); + rapc.run(&mut ap, args.clone(), Some(extra_help), None); + drop(ap); parsed = redo; Ok(()) })()