Add a new `lib.rs` to tvix/eval, which `pub use`s the `interpret` function, and all types mentioned in its return type, and then uses *this* instead of direct `mod` statements in the `main.rs` to implement the entrypoints to the interpreter. This is in preparation for calling these functions from integrated benchmarking infrastructure using Criterion, though other things (like integration tests) might want to do that as well. Change-Id: I7b585134a96b1c56a2ac64d2036b0e51d321bd27 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6155 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI Autosubmit: grfn <grfn@gws.fyi>
46 lines
939 B
Rust
46 lines
939 B
Rust
use std::{
|
|
env, fs,
|
|
io::{self, Write},
|
|
mem, process,
|
|
};
|
|
|
|
fn main() {
|
|
let mut args = env::args();
|
|
if args.len() > 2 {
|
|
println!("Usage: tvix-eval [script]");
|
|
process::exit(1);
|
|
}
|
|
|
|
if let Some(file) = args.nth(1) {
|
|
run_file(&file);
|
|
} else {
|
|
run_prompt();
|
|
}
|
|
}
|
|
|
|
fn run_file(file: &str) {
|
|
let contents = fs::read_to_string(file).expect("failed to read the input file");
|
|
|
|
run(contents);
|
|
}
|
|
|
|
fn run_prompt() {
|
|
let mut line = String::new();
|
|
|
|
loop {
|
|
print!("> ");
|
|
io::stdout().flush().unwrap();
|
|
io::stdin()
|
|
.read_line(&mut line)
|
|
.expect("failed to read user input");
|
|
run(mem::take(&mut line));
|
|
line.clear();
|
|
}
|
|
}
|
|
|
|
fn run(code: String) {
|
|
match tvix_eval::interpret(&code) {
|
|
Ok(result) => println!("=> {} :: {}", result, result.type_of()),
|
|
Err(err) => eprintln!("{}", err),
|
|
}
|
|
}
|