aboutsummaryrefslogtreecommitdiff
path: root/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.rs')
-rw-r--r--src/parser.rs73
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
-}