use anyhow::{anyhow, Result};
use std::path::PathBuf;
pub enum RunnerCommand {
Runner(RunnerArgs),
Version,
Help,
}
impl RunnerCommand {
pub fn parse_args<A>(args: A) -> Result<Self>
where
A: Iterator<Item = String>,
{
let mut executable = None;
let mut quiet = false;
let mut runner_args = None;
let mut arg_iter = args.fuse();
loop {
if executable.is_some() {
let args: Vec<_> = arg_iter.collect();
if !args.is_empty() {
runner_args = Some(args);
}
break;
}
let next = match arg_iter.next() {
Some(next) => next,
None => break,
};
match next.as_str() {
"--help" | "-h" => {
return Ok(RunnerCommand::Help);
}
"--version" => {
return Ok(RunnerCommand::Version);
}
"--quiet" => {
quiet = true;
}
exe => {
executable = Some(PathBuf::from(exe));
}
}
}
Ok(Self::Runner(RunnerArgs {
executable: executable
.ok_or_else(|| anyhow!("excepted path to kernel executable as first argument"))?,
quiet,
runner_args,
}))
}
}
#[derive(Debug, Clone)]
pub struct RunnerArgs {
pub executable: PathBuf,
pub quiet: bool,
pub runner_args: Option<Vec<String>>,
}