limage 0.5.0

A Cargo utility for running/testing Rust-based kernels using the Limine bootloader
Documentation
use anyhow::{anyhow, Result};
use std::path::PathBuf;

pub enum LimageCommand {
    Build,
    Run(LimageArgs),
    Version,
    Help,
}

impl LimageCommand {
    pub fn parse_args<A>(args: A) -> Result<Self>
    where
        A: Iterator<Item = String>,
    {
        let mut executable = None;
        let mut build_only = false;
        let mut arg_iter = args.fuse();

        let mut args_count = -1;
        loop {
            args_count += 1;

            let next = match arg_iter.next() {
                Some(next) => next,
                None => break,
            };

            match next.as_str() {
                "--help" | "-h" => {
                    return Ok(LimageCommand::Help);
                },
                "--version" | "-v" => {
                    return Ok(LimageCommand::Version);
                },
                "build" => {
                    build_only = true;
                },
                exe => {
                    executable = Some(PathBuf::from(exe));
                }
            }
        }

        if args_count < 2 {
            build_only = true;
        }

        let executable_or_error = executable.ok_or_else(|| anyhow!("expected path to kernel executable as first argument"))?;
        if build_only {
            Ok(Self::Build)
        } else {
            Ok(Self::Run(LimageArgs {executable: executable_or_error}))
        }
    }
}

#[derive(Debug, Clone)]
pub struct LimageArgs {
    pub executable: PathBuf
}