From 16dfbb27d5292f0c960d1bfb546d8ad73d50bb85 Mon Sep 17 00:00:00 2001 From: greg Date: Sun, 20 Dec 2015 13:20:24 -0800 Subject: [PATCH] Use state features from simplerepl --- src/main.rs | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1132a1e..e98a438 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,17 @@ +#![feature(advanced_slice_patterns, slice_patterns)] + extern crate simplerepl; use std::path::Path; use std::fs::File; use std::io::Read; -use simplerepl::REPL; +use simplerepl::{REPL, ReplState}; use tokenizer::tokenize; mod tokenizer; + fn main() { let args: Vec = std::env::args().collect(); println!("Schala v 0.02"); @@ -18,10 +21,41 @@ fn main() { source_file.read_to_string(&mut buffer).unwrap(); panic!("Not implemented yet"); } else { - REPL::default(repl_handler).run(); + let initial_state = InterpreterState { show_tokens: false, show_parse: false }; + REPL::with_prompt_and_state(Box::new(repl_handler), ">> ", initial_state) + .run(); } } -fn repl_handler(input: &str) -> String { - format!("{:?}", tokenize(input)) +struct InterpreterState { + show_tokens: bool, + show_parse: bool, +} + +impl ReplState for InterpreterState { + fn update_state(&mut self, input: &Vec<&str>) { + match &input[..] { + ["set", "show", "tokens", "true"] => { + self.show_tokens = true; + }, + ["set", "show", "tokens", "false"] => { + self.show_tokens = false; + }, + ["set", "show", "parse", "true"] => { + self.show_parse = true; + }, + ["set", "show", "parse", "false"] => { + self.show_parse = false; + }, + _ => () + } + } +} + +fn repl_handler(input: &str, state: &mut InterpreterState) -> String { + if state.show_tokens { + format!("Tokens: {:?}", tokenize(input)) + } else { + format!("{:?}", tokenize(input)) + } }