cli: integrate custom StoreFactories registration with CliRunner

.set_store_factories() could be invoked for any CliRunner<F> type, but
I don't care much about that since the type parameter F will be removed
soon.
This commit is contained in:
Yuya Nishihara 2023-01-03 18:38:17 +09:00
parent f34f764b9f
commit 0110814885
2 changed files with 28 additions and 7 deletions

View File

@ -34,11 +34,7 @@ enum CustomCommands {
InitJit, InitJit,
} }
fn run( fn create_store_factories() -> StoreFactories {
ui: &mut Ui,
mut command_helper: CommandHelper,
matches: &ArgMatches,
) -> Result<(), CommandError> {
let mut store_factories = StoreFactories::default(); let mut store_factories = StoreFactories::default();
// Register the backend so it can be loaded when the repo is loaded. The name // Register the backend so it can be loaded when the repo is loaded. The name
// must match `Backend::name()`. // must match `Backend::name()`.
@ -46,7 +42,14 @@ fn run(
"jit", "jit",
Box::new(|store_path| Box::new(JitBackend::load(store_path))), Box::new(|store_path| Box::new(JitBackend::load(store_path))),
); );
command_helper.set_store_factories(store_factories); store_factories
}
fn run(
ui: &mut Ui,
command_helper: CommandHelper,
matches: &ArgMatches,
) -> Result<(), CommandError> {
match CustomCommands::from_arg_matches(matches) { match CustomCommands::from_arg_matches(matches) {
// Handle our custom command // Handle our custom command
Ok(CustomCommands::InitJit) => { Ok(CustomCommands::InitJit) => {
@ -64,6 +67,7 @@ fn run(
fn main() { fn main() {
CliRunner::init() CliRunner::init()
.set_store_factories(create_store_factories())
.add_subcommand::<CustomCommands>() .add_subcommand::<CustomCommands>()
.set_dispatch_fn(run) .set_dispatch_fn(run)
.run_and_exit(); .run_and_exit();

View File

@ -1688,6 +1688,7 @@ pub fn handle_command_result(ui: &mut Ui, result: Result<(), CommandError>) -> i
pub struct CliRunner<F> { pub struct CliRunner<F> {
tracing_subscription: TracingSubscription, tracing_subscription: TracingSubscription,
app: clap::Command, app: clap::Command,
store_factories: Option<StoreFactories>,
dispatch_fn: F, dispatch_fn: F,
} }
@ -1700,10 +1701,21 @@ impl CliRunner<()> {
CliRunner { CliRunner {
tracing_subscription, tracing_subscription,
app: crate::commands::default_app(), app: crate::commands::default_app(),
store_factories: None,
dispatch_fn: (), dispatch_fn: (),
} }
} }
/// Replaces `StoreFactories` to be used.
pub fn set_store_factories(self, store_factories: StoreFactories) -> Self {
CliRunner {
tracing_subscription: self.tracing_subscription,
app: self.app,
store_factories: Some(store_factories),
dispatch_fn: self.dispatch_fn,
}
}
/// Registers new subcommands in addition to the default ones. /// Registers new subcommands in addition to the default ones.
// TODO: maybe take dispatch_fn for the subcommands? // TODO: maybe take dispatch_fn for the subcommands?
pub fn add_subcommand<C>(self) -> Self pub fn add_subcommand<C>(self) -> Self
@ -1713,6 +1725,7 @@ impl CliRunner<()> {
CliRunner { CliRunner {
tracing_subscription: self.tracing_subscription, tracing_subscription: self.tracing_subscription,
app: C::augment_subcommands(self.app), app: C::augment_subcommands(self.app),
store_factories: self.store_factories,
dispatch_fn: self.dispatch_fn, dispatch_fn: self.dispatch_fn,
} }
} }
@ -1725,6 +1738,7 @@ impl CliRunner<()> {
CliRunner { CliRunner {
tracing_subscription: self.tracing_subscription, tracing_subscription: self.tracing_subscription,
app: self.app, app: self.app,
store_factories: self.store_factories,
dispatch_fn, dispatch_fn,
} }
} }
@ -1736,12 +1750,15 @@ where
{ {
pub fn run(self, ui: &mut Ui) -> Result<(), CommandError> { pub fn run(self, ui: &mut Ui) -> Result<(), CommandError> {
ui.reset(crate::config::read_config()?); ui.reset(crate::config::read_config()?);
let (command_helper, matches) = parse_args( let (mut command_helper, matches) = parse_args(
ui, ui,
self.app, self.app,
&self.tracing_subscription, &self.tracing_subscription,
std::env::args_os(), std::env::args_os(),
)?; )?;
if let Some(store_factories) = self.store_factories {
command_helper.set_store_factories(store_factories);
}
// TODO: pass CommandHelper by reference // TODO: pass CommandHelper by reference
(self.dispatch_fn)(ui, command_helper, &matches) (self.dispatch_fn)(ui, command_helper, &matches)
} }