Mercurial > public > mercurial-scm > hg
diff rust/rhg/src/main.rs @ 46592:80840b651721
rhg: Group values passed to every sub-command into a struct
The set of which values this is is evidently not stable yet,
so this will make changes easier. Also it is growing, and the function
signatures are getting out hand.
Differential Revision: https://phab.mercurial-scm.org/D10003
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 15 Feb 2021 20:05:32 +0100 |
parents | 21d3b40b4c0e |
children | 5ce2aa7c2ad5 |
line wrap: on
line diff
--- a/rust/rhg/src/main.rs Fri Feb 12 16:54:30 2021 +0100 +++ b/rust/rhg/src/main.rs Mon Feb 15 20:05:32 2021 +0100 @@ -1,9 +1,11 @@ extern crate log; +use crate::ui::Ui; use clap::App; use clap::AppSettings; use clap::Arg; use clap::ArgMatches; use format_bytes::format_bytes; +use hg::config::Config; use std::path::Path; mod error; @@ -48,31 +50,41 @@ let (subcommand_name, subcommand_matches) = matches.subcommand(); let run = subcommand_run_fn(subcommand_name) .expect("unknown subcommand name from clap despite AppSettings::SubcommandRequired"); - let args = subcommand_matches + let subcommand_args = subcommand_matches .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired"); // Global arguments can be in either based on e.g. `hg -R ./foo log` v.s. // `hg log -R ./foo` - let value_of_global_arg = - |name| args.value_of_os(name).or_else(|| matches.value_of_os(name)); + let value_of_global_arg = |name| { + subcommand_args + .value_of_os(name) + .or_else(|| matches.value_of_os(name)) + }; // For arguments where multiple occurences are allowed, return a // possibly-iterator of all values. let values_of_global_arg = |name: &str| { let a = matches.values_of_os(name).into_iter().flatten(); - let b = args.values_of_os(name).into_iter().flatten(); + let b = subcommand_args.values_of_os(name).into_iter().flatten(); a.chain(b) }; - let repo_path = value_of_global_arg("repository").map(Path::new); let config_args = values_of_global_arg("config") // `get_bytes_from_path` works for OsStr the same as for Path .map(hg::utils::files::get_bytes_from_path); - let config = hg::config::Config::load(config_args)?; - run(&ui, &config, repo_path, args) + let non_repo_config = &hg::config::Config::load(config_args)?; + + let repo_path = value_of_global_arg("repository").map(Path::new); + + run(&CliInvocation { + ui, + subcommand_args, + non_repo_config, + repo_path, + }) } fn main() { - let ui = ui::Ui::new(); + let ui = Ui::new(); let exit_code = match main_with_result(&ui) { Ok(()) => exitcode::OK, @@ -109,12 +121,9 @@ )+ } - fn subcommand_run_fn(name: &str) -> Option<fn( - &ui::Ui, - &hg::config::Config, - Option<&Path>, - &ArgMatches, - ) -> Result<(), CommandError>> { + pub type RunFn = fn(&CliInvocation) -> Result<(), CommandError>; + + fn subcommand_run_fn(name: &str) -> Option<RunFn> { match name { $( stringify!($command) => Some(commands::$command::run), @@ -133,3 +142,9 @@ root config } +pub struct CliInvocation<'a> { + ui: &'a Ui, + subcommand_args: &'a ArgMatches<'a>, + non_repo_config: &'a Config, + repo_path: Option<&'a Path>, +}