chiark / gitweb /
otter cli: Move ArgumentParser out of RawArgParserContext
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 6 Jun 2021 23:54:14 +0000 (00:54 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 7 Jun 2021 00:19:00 +0000 (01:19 +0100)
We need to work with different ones.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cli/clisupport.rs
cli/otter.rs

index b0ec1ee1047ee53df1bd43f9a2a309fe57716d6e..856a491397e007e18b4bcbdf0e819a85b9a74442 100644 (file)
@@ -127,19 +127,15 @@ pub type ExtraMessage<'exh> =
 pub type ApCompleter<'apc,T,U> =
   &'apc dyn Fn(T) -> Result<U, ArgumentParseError>;
 
-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<T>(args0: &[String], parsed: &'a mut T, apmaker: ApMaker<T>)
-                -> 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<String>,
              extra_help: Option<ExtraMessage>,
              extra_error: Option<ExtraMessage>) {
@@ -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<T:Default,U>(
   extra_help: Option<ExtraMessage>,
 ) -> 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
 }
index b3d6383c798831d05724285a8bb8250570d249bb..846a2d6ef92ba1bcc5b9be9f12bc374a3fe0bbfa 100644 (file)
@@ -332,9 +332,11 @@ fn main() {
   let mut parsed: RawMainArgs = default();
   let args: Vec<String> = 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(())
   })()