use std::env; use std::fs; use std::io; use std::io::Write; use std::process; mod rlox; mod scanner; mod token_type; mod token; use crate::rlox::RLox; use crate::scanner::Scanner; // Exit codes from #include const EX_OK: i32 = 0; const EX_DATAERR: i32 = 65; const EX_USAGE : i32 = 66; fn main() { let args: Vec = env::args().collect(); let exit_code = match args.len() { 1 => run_prompt(), 2 => run_file(&args[1]), _ => { println!("Usage : rlox [script]"); EX_USAGE } }; process::exit(exit_code); } fn run_file( file_path: &str ) -> i32 { let contents = fs::read_to_string(file_path) .expect(&format!("Should have been able to read the file {file_path}")); run(contents) } fn run_prompt() -> i32 { let mut exit_code = EX_OK; loop { print!("> "); io::stdout().flush().expect("Unable to flush stdout"); let mut line = String::new(); io::stdin() .read_line(&mut line) .expect("Failed to read line"); if line.trim().is_empty() { break; } exit_code = run(line); } exit_code } fn run( script: String ) -> i32 { let rlox_interpreter = RLox { had_error: false }; if rlox_interpreter.had_error { EX_DATAERR } else { EX_OK } } // Implémentations de référence : // https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust // Pause : // http://www.craftinginterpreters.com/scanning.html#lexical-errors