diff --git a/src/lib/parser/statement/mod.rs b/src/lib/parser/statement/mod.rs index 5548f51619e63e99a90d94d61b850e0cba923f52..5733e278d2d0d75ce0ccc5487b15f55430414bc9 100644 --- a/src/lib/parser/statement/mod.rs +++ b/src/lib/parser/statement/mod.rs @@ -12,8 +12,8 @@ use shell::flow_control::Statement; /// `Statement` pub(crate) fn parse_and_validate<'a>(statement: Result<StatementVariant, StatementError>) -> Statement { match statement { - Ok(StatementVariant::And(statement)) => parse(statement), - Ok(StatementVariant::Or(statement)) => parse(statement), + Ok(StatementVariant::And(statement)) => Statement::And(Box::new(parse(statement))), + Ok(StatementVariant::Or(statement)) => Statement::Or(Box::new(parse(statement))), Ok(StatementVariant::Default(statement)) => parse(statement), Err(err) => { eprintln!("ion: {}", err); diff --git a/src/lib/parser/statement/splitter.rs b/src/lib/parser/statement/splitter.rs index 8b71a694c8275a6a6b228c9a01187ae4162b56d0..112871cb1e7f4b04541dda8ed1e7cf8219d354fd 100644 --- a/src/lib/parser/statement/splitter.rs +++ b/src/lib/parser/statement/splitter.rs @@ -3,7 +3,7 @@ // - Validate syntax in methods use std::{ - cmp::max, fmt::{self, Display, Formatter}, u16, + fmt::{self, Display, Formatter}, u16, }; bitflags! { @@ -122,18 +122,17 @@ impl<'a> StatementSplitter<'a> { } fn get_statement(&mut self, flags: Flags) -> StatementVariant<'a> { - self.flags.insert(flags); - match self.flags { - Flags::AND => { + let variant = if flags.contains(Flags::AND) { + self.flags.remove(Flags::AND); StatementVariant::And(&self.data[..self.read - 1].trim()) - } - Flags::OR => { + } else if flags.contains(Flags::OR) { + self.flags.remove(Flags::OR); StatementVariant::Or(&self.data[..self.read - 1].trim()) - } - _ => { + } else { StatementVariant::Default(&self.data[self.start..self.read - 1].trim()) - } - } + }; + self.flags.insert(flags); + variant } } @@ -146,8 +145,7 @@ impl<'a> Iterator for StatementSplitter<'a> { let mut else_found = false; let mut else_pos = 0; let mut error = None; - let c = self.data; - let mut bytes = c.bytes().skip(self.read); + let mut bytes = self.data.bytes().skip(self.read); while let Some(character) = bytes.next() { self.read += 1; match character { @@ -326,6 +324,8 @@ impl<'a> Iterator for StatementSplitter<'a> { if !output.is_empty() { if "if" != *output { self.read = else_pos; + self.flags.remove(Flags::AND); + self.flags.remove(Flags::OR); return Some(Ok(StatementVariant::Default("else"))); } }