use clap::Parser;
use monkey_rs::{
eval::{self, environment::Env},
parser, repl,
};
use rustyline::Result;
use std::cell::RefCell;
use std::path::PathBuf;
use std::rc::Rc;
#[derive(Parser, Debug)]
struct Args {
#[arg(value_name = "FILE")]
input: Option<PathBuf>,
}
fn main() -> Result<()> {
let args = Args::parse();
if let Some(file) = args.input {
if let Some(ext) = file.extension() {
if ext.to_string_lossy().to_lowercase() != "monkey" {
eprint!("Error: File must have a .monkey extension");
return Ok(());
}
} else {
eprintln!("Error: File has no extension");
return Ok(());
}
let input = std::fs::read_to_string(file)?;
let env: Env = Rc::new(RefCell::new(Default::default()));
match parser::parse(&input) {
Ok(program) => match eval::eval(program, &Rc::clone(&env)) {
Ok(evaluated) => println!("{}", evaluated),
Err(e) => eprintln!("{}", e),
},
Err(e) => eprintln!("{}", e),
}
} else {
repl::start()?;
}
Ok(())
}