diff --git a/README.md b/README.md index fe6cad0..515bdb7 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,4 @@ - [ ] Positional variables - [ ] `RANDOM` - [ ] Handle signals +- [x] Handle when command is not found diff --git a/src/buffer.rs b/src/buffer.rs index 9424734..ceab8ae 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -2,6 +2,7 @@ use std::io as stdio; use stdio::stdin; use crate::parser; use crate::job; +use crate::error::command_not_found; pub struct Buffer { buffer: String, @@ -34,6 +35,7 @@ impl Buffer { pub fn try_spawn(&mut self) -> Option { if ! self.buffer.is_empty() { self.argv = parser::parse(&self.buffer); + let command_name = self.argv[0].to_string(); let result = job::execute(&mut self.argv); if result.is_ok() { @@ -43,8 +45,7 @@ impl Buffer { return Some(result.code().unwrap()); } } else { - eprintln!("{}", result.unwrap_err()); - return Some(127); + return Some(command_not_found(&command_name)); } } diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..b51b2a3 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,18 @@ +use std::env; +use std::path::Path; + +fn error(message: &str) { + let argv0: String = env::args().next().unwrap(); + let program_name = Path::new(&argv0) + .file_name() + .unwrap() + .to_str() + .unwrap(); + eprintln!("{}: {}", program_name, message); +} + +pub fn command_not_found(command: &String) -> i32 { + let message = command.to_owned() + ": command not found"; + error(&message); + 127 +} diff --git a/src/main.rs b/src/main.rs index 67b8fda..ced5470 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ mod buffer; mod parser; mod job; mod variables; +mod error; use std::process::exit; use variables::Variables;