eh: streamline multicall command handler

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I5da79ddb79286dbc06f2ae0101b6ad086a6a6964
This commit is contained in:
raf 2026-03-03 23:47:12 +03:00
commit 44be9e1c1f
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -1,7 +1,6 @@
use std::{env, path::Path}; use std::{env, path::Path};
use eh::{Cli, Command, CommandFactory, Parser}; use eh::{Cli, Command, CommandFactory, Parser};
use error::Result;
use yansi::Paint; use yansi::Paint;
mod commands; mod commands;
@ -26,11 +25,30 @@ fn main() {
} }
} }
// Design partially taken from Stash fn handle_command(command: &str, args: &[String]) -> error::Result<i32> {
let hash_extractor = util::RegexHashExtractor;
let fixer = util::DefaultNixFileFixer;
let classifier = util::DefaultNixErrorClassifier;
match command {
"update" => commands::update::handle_update(args),
"run" | "shell" | "build" => {
commands::handle_nix_command(
command,
args,
&hash_extractor,
&fixer,
&classifier,
)
},
_ => unreachable!(),
}
}
fn dispatch_multicall( fn dispatch_multicall(
app_name: &str, app_name: &str,
args: std::env::Args, args: std::env::Args,
) -> Option<Result<i32>> { ) -> Option<error::Result<i32>> {
let rest: Vec<String> = args.collect(); let rest: Vec<String> = args.collect();
let subcommand = match app_name { let subcommand = match app_name {
@ -61,31 +79,10 @@ fn dispatch_multicall(
return Some(Ok(0)); return Some(Ok(0));
} }
if subcommand == "update" { Some(handle_command(subcommand, &rest))
return Some(commands::update::handle_update(&rest));
}
let hash_extractor = util::RegexHashExtractor;
let fixer = util::DefaultNixFileFixer;
let classifier = util::DefaultNixErrorClassifier;
Some(match subcommand {
"run" | "shell" | "build" => {
commands::handle_nix_command(
subcommand,
&rest,
&hash_extractor,
&fixer,
&classifier,
)
},
// subcommand is assigned from the match on app_name above;
// only "run"/"shell"/"build" are possible values.
_ => unreachable!(),
})
} }
fn run_app() -> Result<i32> { fn run_app() -> error::Result<i32> {
let mut args = env::args(); let mut args = env::args();
let bin = args.next().unwrap_or_else(|| "eh".to_string()); let bin = args.next().unwrap_or_else(|| "eh".to_string());
let app_name = Path::new(&bin) let app_name = Path::new(&bin)
@ -100,42 +97,14 @@ fn run_app() -> Result<i32> {
let cli = Cli::parse(); let cli = Cli::parse();
let hash_extractor = util::RegexHashExtractor;
let fixer = util::DefaultNixFileFixer;
let classifier = util::DefaultNixErrorClassifier;
match cli.command { match cli.command {
Some(Command::Run { args }) => { Some(Command::Run { args }) => handle_command("run", &args),
commands::handle_nix_command(
"run",
&args,
&hash_extractor,
&fixer,
&classifier,
)
},
Some(Command::Shell { args }) => { Some(Command::Shell { args }) => handle_command("shell", &args),
commands::handle_nix_command(
"shell",
&args,
&hash_extractor,
&fixer,
&classifier,
)
},
Some(Command::Build { args }) => { Some(Command::Build { args }) => handle_command("build", &args),
commands::handle_nix_command(
"build",
&args,
&hash_extractor,
&fixer,
&classifier,
)
},
Some(Command::Update { args }) => commands::update::handle_update(&args), Some(Command::Update { args }) => handle_command("update", &args),
None => { None => {
Cli::command().print_help()?; Cli::command().print_help()?;