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(),
}
pub fn run(&mut self,
+ ap: &mut ArgumentParser<'_>,
args: Vec<String>,
extra_help: Option<ExtraMessage>,
extra_error: Option<ExtraMessage>) {
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 => {
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
}
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()
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!(
};
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(())
})()