diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2020-11-24 23:28:03 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2020-11-29 12:52:50 +0200 |
commit | 4a88b5c888da073407431cf435527ce69b032e3a (patch) | |
tree | 64f828ac7b9085d0ee7a03c4e926a0806e2c85d5 /src/parser.rs | |
parent | Update manpage (diff) | |
download | rshell-4a88b5c888da073407431cf435527ce69b032e3a.tar.xz |
Refactoring
Add doc/rc.pdf
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 -} |