From: Ian Jackson Date: Fri, 6 Nov 2020 23:25:42 +0000 (+0000) Subject: wip cli for new accounts X-Git-Tag: otter-0.2.0~554 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=fa9f041da75d7bd62ca6a7f8547a1c473d1b5acc;p=otter.git wip cli for new accounts Signed-off-by: Ian Jackson --- diff --git a/src/bin/otter.rs b/src/bin/otter.rs index 3424a67a..f0cac36f 100644 --- a/src/bin/otter.rs +++ b/src/bin/otter.rs @@ -15,6 +15,7 @@ type E = anyhow::Error; type Insn = MgmtGameInstruction; type Resp = MgmtGameResponse; type AS = AccountScope; +type APE = ArgumentParseError; use argparse::action::ParseResult::Parsed; @@ -61,7 +62,7 @@ const EXIT_DISASTER : i32 = 16; #[derive(Debug)] struct MainOpts { account: AccountName, - scope: AccountName, + scope: AccountScope, socket_path: String, verbose: i32, } @@ -84,14 +85,12 @@ impl From for ArgumentParseError { } } -fn parse_args( +fn parse_args( args: Vec, - apmaker: &F, + apmaker: &dyn Fn(&mut T) -> ArgumentParser, completer: &dyn Fn(T) -> Result, extra_help: Option<&dyn Fn(&mut dyn Write) -> Result<(), io::Error>>, ) -> U -where T: Default, - F: Fn(&mut T) -> ArgumentParser, { let mut parsed = Default::default(); let ap = apmaker(&mut parsed); @@ -137,7 +136,7 @@ fn main() { subcommand: String, subargs: Vec, }; - let (subcommand, subargs, mo) = parse_args::( + let (subcommand, subargs, mo) = parse_args::( env::args().collect(), &|rma|{ use argparse::*; @@ -169,11 +168,11 @@ fn main() { verbose.add_option(&["-v","--verbose"], IncrBy(1), "increase verbosity (default is short progress messages)"); ap - }, Some(|RawMainArgs { + }, &|RawMainArgs { account, scope, socket_path, verbose, config_filename, subcommand, subargs, }|{ - let account : AccountName = account.map(Ok).unwrap_or_else(||{ + let account : AccountName = account.map(Ok::<_,APE>).unwrap_or_else(||{ let user = env::var("USER").map_err(|e| ArgumentParseError( format!("default account needs USER env var: {}", &e) ))?; @@ -183,16 +182,15 @@ fn main() { }) })?; let scope = scope.unwrap_or_else(|| account.scope.clone()); - let mut config_store = None; + let mut config_store : Option,APE>> = None; let config = ||{ - config_store.unwrap_or_else(||{ + Ok::<_,APE>(&config_store.unwrap_or_else(||{ ServerConfig::read(config_filename.as_ref().map(String::as_str)) .context("read config file")?; - Ok(()) - })?; - Ok(otter::global::config()) + Ok(otter::global::config()) + })?) }; - let socket_path = socket_path.map(Ok).unwrap_or_else(||{ + let socket_path = socket_path.map(Ok::<_,APE>).unwrap_or_else(||{ Ok(config()?.command_socket.clone()) })?; Ok((subcommand, subargs, MainOpts { @@ -201,7 +199,7 @@ fn main() { socket_path, verbose, })) - }), Some(&|w|{ + }, Some(&|w|{ writeln!(w, "\nSubcommands:")?; let maxlen = inventory::iter::.into_iter() .map(|Subcommand(verb,_,_)| verb.len())