From c3a73e3104447757942a53a440e68a3a0872f8ce Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Mon, 30 Sep 2024 21:24:41 +0200 Subject: [PATCH] clean up command interface --- src/main.rs | 56 ++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1fe6369..a0911b4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::{env, fs, io::stdin, process::exit}; +use std::{env, fs, io::{stdin, stdout, Write}, process::exit}; use owo_colors::OwoColorize; @@ -15,7 +15,6 @@ struct Machine { input: Vec, input_index: usize, output: Vec, - state: State, steps: usize, } @@ -79,13 +78,6 @@ enum Direction { Right, } -#[derive(Debug, Default, PartialEq)] -enum State { - #[default] - Running, - EndOfProgram, -} - fn main() { let args: Vec<_> = env::args().collect(); if args.len() <= 1 { @@ -109,9 +101,11 @@ fn main() { let mut interpreter = Machine::new(&source, input_data); print!("\x1B[2J"); // clear screen + interpreter.show(); loop { - interpreter.show(); + print!(":> "); + stdout().flush().unwrap(); let mut input_text = String::new(); stdin().read_line(&mut input_text).unwrap(); let action: Vec<_> = input_text.trim().split_ascii_whitespace().collect(); @@ -122,18 +116,35 @@ fn main() { .unwrap_or(&input_text) .as_bytes()[6..], ); + interpreter.print_input(); continue; } + + const HELP_TEXT:&str = r#"\n | step + - step once +step [n] + - step n times +input [text] + - append text to the input buffer +dbg | debug + - debug print interpreter state +q | quit | exit + - exit to terminal +"#; match action.as_slice() { - [] | ["step"] => interpreter.step_once(), + [] | ["step"] => { + interpreter.step_once(); + interpreter.show(); + } ["dbg" | "debug"] => { dbg!(&interpreter); } ["step", num] => _ = num.parse().map(|n| interpreter.step(n)), - ["run"] => interpreter.run(), ["q" | "exit" | "quit"] => break, - - _ => println!("{}", "unrecognised command".red()), + ["h" | "help" | "?"] => { + println!("{}", HELP_TEXT.green()); + } + _ => println!("{}", "unrecognised command (try 'help')".red()), } } } @@ -148,23 +159,12 @@ impl Machine { input, input_index: 0, output: Vec::new(), - state: State::default(), steps: 0, } } - fn run(&mut self) { - while self.state == State::Running { - self.step_once(); - self.show(); - } - } - fn step(&mut self, n: usize) { for _ in 0..n { - if self.state != State::Running { - break; - } self.step_once(); } } @@ -239,10 +239,14 @@ impl Machine { if !self.output.is_empty() { println!("output: '{}'", String::from_utf8_lossy(&self.output)); } + self.print_input(); + println!("steps: {}", self.steps); + } + + fn print_input(&self){ if !self.input.is_empty() { println!("input: '{}'", String::from_utf8_lossy(&self.input)); } - println!("steps: {}", self.steps); } fn step_once(&mut self) {