diff options
Diffstat (limited to 'src/parser.rs')
-rw-r--r-- | src/parser.rs | 73 |
1 files changed, 0 insertions, 73 deletions
diff --git a/src/parser.rs b/src/parser.rs deleted file mode 100644 index 0c771f9..0000000 --- a/src/parser.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::io::Error; -use std::path::PathBuf; -use std::process::ExitStatus; - -// ; on prev cmd any -// && on prev cmd okay -// || on prev cmd fail - -mod command; -use command::{CommandInfo, RunOn, RunResult}; - -pub struct CommandLine(Vec<CommandInfo>); - -impl CommandLine { - pub fn new(line: &str) -> Self { - CommandLine(split(line)) - } - - pub fn run( - &self, - home: &PathBuf, - mut status: Option<ExitStatus>, - ) -> Result<Option<ExitStatus>, Error> { - for cmd in &self.0 { - if cmd.when.can_run(&status) { - match cmd.run(&home, &status)? { - RunResult::Command(s) => status = Some(s), - RunResult::Builtin => {} - } - } - } - Ok(status) - } -} - -fn split(line: &str) -> Vec<CommandInfo> { - let mut r: Vec<CommandInfo> = Vec::new(); - - let mut next = line.chars().peekable(); - let mut iter = line.chars().enumerate(); - - let mut start_idx = 0; - let mut state = RunOn::Always; - - while let Some((i, v)) = { - next.next(); - iter.next() - } { - let n = next.peek(); - - if v == ';' { - r.push(CommandInfo::new(&line[start_idx..i], state)); - state = RunOn::Always; - start_idx = i + 1; - } else if v == '|' && n == Some(&'|') { - r.push(CommandInfo::new(&line[start_idx..i], state)); - state = RunOn::ExitFailure; - start_idx = i + 2; - next.next(); - iter.next(); - } else if v == '&' && n == Some(&'&') { - r.push(CommandInfo::new(&line[start_idx..i], state)); - state = RunOn::ExitSuccess; - start_idx = i + 2; - next.next(); - iter.next(); - } else if n == None { - r.push(CommandInfo::new(&line[start_idx..], state)); - } - } - - r -} |