tome-scripts 0.12.2

Turn directories of shell scripts into full-blown CLIs
Documentation
use super::script;
use std::path::PathBuf;

pub struct ScriptInvocation<'a> {
    pub target: PathBuf,
    pub args: Vec<&'a String>,
}

pub enum FindResult<'a> {
    File(ScriptInvocation<'a>),
    Directory(PathBuf),
}

pub fn find_script<'a>(
    command_directory_path: &str,
    args: &'a [String],
) -> Result<FindResult<'a>, String> {
    let mut target = PathBuf::from(&command_directory_path);
    let mut args_peekable = args.iter().peekable();
    while let Some(arg) = args_peekable.peek() {
        if arg.is_empty() {
            break;
        }
        target.push(arg);
        if let Some(resolved) = script::resolve_source_path(&target) {
            target = resolved;
            args_peekable.next();
            let remaining_args: Vec<_> = args_peekable.collect();
            return Ok(FindResult::File(ScriptInvocation {
                target,
                args: remaining_args,
            }));
        } else if target.is_dir() {
            args_peekable.next();
        } else {
            target.pop();
            break;
        }
    }
    let remaining_args: Vec<_> = args_peekable.collect();
    match remaining_args.len() {
        0 => Ok(FindResult::Directory(target)),
        _ => Err(format!(
            "command {} not found in directory {}",
            remaining_args[0],
            target.to_str().unwrap_or("")
        )),
    }
}