zuzu-rust 0.3.0

Rust implementation of ZuzuScript
Documentation
use std::env;
use std::path::PathBuf;
use std::process::ExitCode;

use zuzu_rust::Runtime;

fn main() -> ExitCode {
    let mut args = env::args().skip(1);
    let Some(script) = args.next() else {
        eprintln!("usage: dump_test_output path/to/test.zzs");
        return ExitCode::from(2);
    };

    let cwd = env::current_dir().expect("cwd");
    let repo_root = find_repo_root(&cwd).expect("repo root");
    let runtime = Runtime::new(vec![
        repo_root.join("t/modules"),
        repo_root.join("stdlib").join("test-modules"),
        repo_root.join("modules"),
        repo_root.join("stdlib").join("modules"),
    ]);
    if let Err(err) = runtime.run_script_file(&PathBuf::from(&script)) {
        eprintln!("{err}");
        return ExitCode::from(1);
    }
    ExitCode::SUCCESS
}

fn find_repo_root(start: &PathBuf) -> Result<PathBuf, String> {
    let mut current = start.clone();
    loop {
        if current.join("modules").is_dir() || current.join("stdlib").join("modules").is_dir() {
            return Ok(current);
        }
        if !current.pop() {
            break;
        }
    }
    Err("could not locate repository root containing modules/ or stdlib/modules/".to_owned())
}