diff --git a/crates/js/examples/shell.rs b/crates/js/examples/shell.rs index 7a6b6cc6..f3156f93 100644 --- a/crates/js/examples/shell.rs +++ b/crates/js/examples/shell.rs @@ -1,64 +1,28 @@ -use std::{ - env, fs, - io::{self, Write}, - process::ExitCode, -}; +use std::{env, fs, process::ExitCode}; fn main() -> ExitCode { - if let Some(filename) = env::args().nth(1) { - let Ok(script) = fs::read_to_string(&filename) else { + let Some(filename) = env::args().nth(1) else { + eprintln!("No filename provided"); + return ExitCode::FAILURE; + }; + + let Ok(script) = fs::read_to_string(&filename) else { + return ExitCode::FAILURE; + }; + + let executable = match script.parse::() { + Ok(executable) => executable, + Err(error) => { + eprintln!("Failed to parse program {error:?}"); return ExitCode::FAILURE; - }; + }, + }; - let program = match script.parse::() { - Ok(program) => program, - Err(error) => { - error.get_context(&script).dump(); - return ExitCode::FAILURE; - }, - }; - - println!("{program:#?}"); - - let mut vm = js::Vm::default(); - if let Err(exception) = vm.execute_program(&program) { - println!("Unhandled Exception: {:?}", exception.value()); - } - vm.dump(); - - ExitCode::SUCCESS - } else { - match run_shell() { - Ok(()) => ExitCode::SUCCESS, - Err(_) => ExitCode::FAILURE, - } - } -} - -fn run_shell() -> io::Result<()> { - let mut buffer = String::new(); - let stdin = io::stdin(); + println!("{executable:#?}"); let mut vm = js::Vm::default(); - loop { - buffer.clear(); - let mut stdout = io::stdout(); - write!(stdout, ">>> ")?; - stdout.flush()?; - - stdin.read_line(&mut buffer)?; - - match buffer.parse::() { - Ok(program) => { - writeln!(stdout, "{program:#?}")?; - - if let Err(exception) = vm.execute_program(&program) { - println!("Unhandled Exception: {:?}", exception.value()); - } + vm.execute(executable); + println!("{vm:#?}"); - vm.dump(); - }, - Err(error) => error.get_context(&buffer).dump(), - } - } + ExitCode::SUCCESS }