limage/
args.rs

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}