From: Ian Jackson Date: Sun, 6 Jun 2021 21:49:53 +0000 (+0100) Subject: otter: Introduce extra_error message hook X-Git-Tag: otter-0.7.0~66 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=5683372d4c633eda770f4e601128d755c530edf6;p=otter.git otter: Introduce extra_error message hook Signed-off-by: Ian Jackson --- diff --git a/cli/clisupport.rs b/cli/clisupport.rs index 15b6da28..022351a4 100644 --- a/cli/clisupport.rs +++ b/cli/clisupport.rs @@ -121,14 +121,16 @@ pub fn noargs(_sa: &mut NoArgs) -> ArgumentParser { ArgumentParser::new() } pub type ApMaker<'apm, T> = &'apm dyn for <'a> Fn(&'a mut T) -> ArgumentParser<'a>; -pub type ExtraHelp<'exh> = +pub type ExtraMessage<'exh> = &'exh dyn Fn(&mut dyn Write) -> Result<(), io::Error>; pub type ApCompleter<'apc,T,U> = &'apc dyn Fn(T) -> Result; pub fn run_argparse(parsed: &mut T, apmaker: ApMaker, - args: Vec, extra_help: Option) + args: Vec, + extra_help: Option, + extra_error: Option) -> String /* us */{ let ap = apmaker(parsed); let us = args.get(0).expect("argv[0] must be provided!").clone(); @@ -136,16 +138,21 @@ pub fn run_argparse(parsed: &mut T, apmaker: ApMaker, let mut stdout = CookedStdout::new(); let mut stderr = io::stderr(); + let em_call = |em: Option, f| { + if let Some(em) = em { em(f).unwrap() }; + }; + let r = ap.parse(args, &mut stdout, &mut stderr); if let Err(rc) = r { exit(match rc { 0 => { - if let Some(eh) = extra_help { - eh(&mut stdout).unwrap(); - } + em_call(extra_help, &mut stdout); 0 }, - 2 => EXIT_USAGE, + 2 => { + em_call(extra_error, &mut stderr); + EXIT_USAGE + }, _ => panic!("unexpected error rc {} from ArgumentParser::parse", rc), }); } @@ -166,10 +173,10 @@ pub fn parse_args( args: Vec, apmaker: ApMaker, completer: ApCompleter, - extra_help: Option, + extra_help: Option, ) -> U { let mut parsed = default(); - let us = run_argparse(&mut parsed, apmaker, args, extra_help); + let us = run_argparse(&mut parsed, apmaker, args, extra_help, None); let completed = argparse_more(us, apmaker, || completer(parsed)); completed } diff --git a/cli/otter.rs b/cli/otter.rs index 8808ff28..b8b2a3cc 100644 --- a/cli/otter.rs +++ b/cli/otter.rs @@ -307,7 +307,7 @@ fn main() { })) }; - let extra_help: ExtraHelp = &|w|{ + let extra_help: ExtraMessage = &|w|{ writeln!(w, "\nSubcommands:")?; let maxlen = inventory::iter::.into_iter() .map(|Subcommand{verb,..}| verb.len()) @@ -321,7 +321,8 @@ fn main() { let mut parsed: RawMainArgs = default(); let args: Vec = env::args().collect(); - let us = run_argparse(&mut parsed, apmaker, args.clone(), Some(extra_help)); + let us = run_argparse(&mut parsed, apmaker, args.clone(), + Some(extra_help), None); let completed = argparse_more(us, apmaker, || ap_completer(parsed)); let (subcommand, subargs, mo) = completed;