diff --git a/src/input.rs b/src/input.rs new file mode 100644 index 0000000..849dd68 --- /dev/null +++ b/src/input.rs @@ -0,0 +1,37 @@ +use std::io as stdio; +use stdio::stdin; + +pub struct Buffer { + buffer: String, +} + +impl Buffer { + pub fn new() -> Self { + Self { + buffer: String::new(), + } + } + + pub fn read_line(&mut self) -> usize { + self.buffer.clear(); + + let result: stdio::Result = stdin().read_line(&mut self.buffer); + + if result.is_err() { + eprintln!("error: invalid UTF-8 characters were read"); + self.buffer.clear(); + 1 + } else { + self.buffer = self.buffer.trim().to_string(); + result.unwrap() + } + } + + pub fn is_empty(&self) -> bool { + self.buffer.is_empty() + } + + pub fn get_buffer(&self) -> &String { + &self.buffer + } +} diff --git a/src/main.rs b/src/main.rs index 8c9d1ab..a30723d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,34 +1,27 @@ -use std::io; -use std::io::Write; +use std::process::exit; +mod input; +mod output; mod parser; fn main() { - let mut buffer = String::new(); - let mut result_bytes_read: io::Result; + let mut buffer = input::Buffer::new(); let mut bytes_read: usize = 1; - let mut command_vec: Vec; + let mut command_line: String; + let mut argv: Vec; while bytes_read != 0 { - buffer.clear(); + output::print_ps1(); + bytes_read = buffer.read_line(); - print!("$ "); - if io::stdout().flush().is_err() { - eprintln!("error: can't fully flush stdout or reached EOF"); - } - result_bytes_read = io::stdin().read_line(&mut buffer); - - if result_bytes_read.is_err() { - eprintln!("error: invalid UTF-8 characters were read"); - bytes_read = 1; - } else { - bytes_read = result_bytes_read.unwrap(); - if bytes_read != 0 { - command_vec = parser::parse(&buffer); - println!("{:?}", command_vec); - } + if ! buffer.is_empty() { + command_line = buffer.get_buffer().to_string(); + argv = parser::parse(&command_line); + println!("{:?}", argv); } } println!(); + + exit(0); } diff --git a/src/output.rs b/src/output.rs new file mode 100644 index 0000000..3888585 --- /dev/null +++ b/src/output.rs @@ -0,0 +1,9 @@ +use std::io::stdout; +use std::io::Write; + +pub fn print_ps1() { + print!("$ "); + if stdout().flush().is_err() { + eprintln!("error: can't fully flush stdout or reached EOF"); + } +}