use schala_repl::{Repl, ProgrammingLanguageInterface, ComputationRequest}; use std::{fs::File, io::Read, path::PathBuf, process::exit, collections::HashSet}; use schala_lang::Schala; //TODO specify multiple langs, and have a way to switch between them fn main() { let args: Vec = std::env::args().collect(); let matches = command_line_options() .parse(&args[1..]) .unwrap_or_else(|e| { eprintln!("Error parsing options: {}", e); exit(1); }); if matches.opt_present("help") { println!("{}", command_line_options().usage("Schala metainterpreter")); exit(0); } if matches.free.is_empty() { let state = Schala::new(); let mut repl = Repl::new(state); repl.run_repl(); } else { let paths: Vec = matches.free.iter().map(PathBuf::from).collect(); //TODO handle more than one file let filename = &paths[0]; let extension = filename.extension().and_then(|e| e.to_str()) .unwrap_or_else(|| { eprintln!("Source file `{}` has no extension.", filename.display()); exit(1); }); //TODO this proably should be a macro for every supported language if extension == Schala::source_file_suffix() { run_noninteractive(paths, Schala::new()); } else { eprintln!("Extension .{} not recognized", extension); exit(1); } } } pub fn run_noninteractive(filenames: Vec, mut language: L) { // for now, ony do something with the first filename let filename = &filenames[0]; let mut source_file = File::open(filename).unwrap(); let mut buffer = String::new(); source_file.read_to_string(&mut buffer).unwrap(); let request = ComputationRequest { source: &buffer, debug_requests: HashSet::new(), }; let response = language.run_computation(request); match response.main_output { Ok(s) => println!("{}", s), Err(s) => eprintln!("{}", s), }; } fn command_line_options() -> getopts::Options { let mut options = getopts::Options::new(); options.optflag("h", "help", "Show help text"); //options.optflag("w", "webapp", "Start up web interpreter"); options }