use std::process::ExitCode;
use bop::{BopHost, BopLimits};
use bop_sys::StdHost;
pub fn run_file(path: &str, no_vm: bool) -> ExitCode {
let source = match std::fs::read_to_string(path) {
Ok(s) => s,
Err(e) => {
eprintln!("error reading `{path}`: {e}");
return ExitCode::from(1);
}
};
let mut check_host = StdHost::new();
let resolver = |path: &str| check_host.resolve_module(path);
match bop::parse_with_warnings_and_resolver(&source, resolver) {
Ok((_stmts, warnings)) => {
for w in &warnings {
eprint!("{}", w.render(&source));
}
}
Err(e) => {
eprint!("{}", e.render(&source));
return ExitCode::from(1);
}
}
let mut host = StdHost::new();
let result = if no_vm {
bop::run(&source, &mut host, &BopLimits::standard())
} else {
bop_vm::run(&source, &mut host, &BopLimits::standard())
};
match result {
Ok(()) => ExitCode::SUCCESS,
Err(e) => {
eprint!("{}", e.render(&source));
ExitCode::from(1)
}
}
}