1use anyhow::{anyhow, Result};
2use std::path::PathBuf;
3
4pub enum LimageCommand {
5 Build,
6 Run(LimageArgs),
7 Version,
8 Help,
9}
10
11impl LimageCommand {
12 pub fn parse_args<A>(args: A) -> Result<Self>
13 where
14 A: Iterator<Item = String>,
15 {
16 let mut executable = None;
17 let mut build_only = false;
18 let mut arg_iter = args.fuse();
19
20 let mut args_count = -1;
21 loop {
22 args_count += 1;
23
24 let next = match arg_iter.next() {
25 Some(next) => next,
26 None => break,
27 };
28
29 match next.as_str() {
30 "--help" | "-h" => {
31 return Ok(LimageCommand::Help);
32 },
33 "--version" | "-v" => {
34 return Ok(LimageCommand::Version);
35 },
36 "build" => {
37 build_only = true;
38 },
39 exe => {
40 executable = Some(PathBuf::from(exe));
41 }
42 }
43 }
44
45 if args_count < 2 {
46 build_only = true;
47 }
48
49 let executable_or_error = executable.ok_or_else(|| anyhow!("expected path to kernel executable as first argument"))?;
50 if build_only {
51 Ok(Self::Build)
52 } else {
53 Ok(Self::Run(LimageArgs {executable: executable_or_error}))
54 }
55 }
56}
57
58#[derive(Debug, Clone)]
59pub struct LimageArgs {
60 pub executable: PathBuf
61}