From c5b34585c4c3c27a062804f608454001eaffa833 Mon Sep 17 00:00:00 2001 From: Michael Murphy <mmstickman@gmail.com> Date: Wed, 30 May 2018 19:07:28 -0600 Subject: [PATCH] Fix splitting logic --- src/lib/parser/statement/splitter.rs | 39 ++++++++++++++++++---------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lib/parser/statement/splitter.rs b/src/lib/parser/statement/splitter.rs index d4810471..24ba51a0 100644 --- a/src/lib/parser/statement/splitter.rs +++ b/src/lib/parser/statement/splitter.rs @@ -122,18 +122,29 @@ impl<'a> StatementSplitter<'a> { } fn get_statement(&mut self, new_flag: Flags) -> StatementVariant<'a> { - let variant = if self.flags.contains(Flags::AND) { - self.flags = self.flags - Flags::AND | new_flag; - StatementVariant::And(&self.data[self.start + 1..self.read - 1].trim()) - } else if self.flags.contains(Flags::OR) { - self.flags = self.flags - Flags::OR | new_flag; - StatementVariant::Or(&self.data[self.start + 1..self.read - 1].trim()) - } else { - self.flags |= new_flag; - let statement = &self.data[self.start..self.read - 1].trim(); - StatementVariant::Default(statement) - }; - variant + if self.flags.contains(Flags::AND) { + self.flags = (self.flags - Flags::AND) | new_flag; + StatementVariant::And(&self.data[self.start + 1..self.read - 1].trim()) + } else if self.flags.contains(Flags::OR) { + self.flags = (self.flags - Flags::OR) | new_flag; + StatementVariant::Or(&self.data[self.start + 1..self.read - 1].trim()) + } else { + self.flags |= new_flag; + let statement = &self.data[self.start..self.read - 1].trim(); + StatementVariant::Default(statement) + } + } + + fn get_statement_from(&mut self, input: &'a str) -> StatementVariant<'a> { + if self.flags.contains(Flags::AND) { + self.flags -= Flags::AND; + StatementVariant::And(input) + } else if self.flags.contains(Flags::OR) { + self.flags -= Flags::OR; + StatementVariant::Or(input) + } else { + StatementVariant::Default(input) + } } } @@ -367,7 +378,7 @@ impl<'a> Iterator for StatementSplitter<'a> { None => { let output = self.data[self.start..].trim(); if output.is_empty() { - return Some(Ok(StatementVariant::Default(output))); + return Some(Ok(self.get_statement_from(output))); } match output.as_bytes()[0] { b'>' | b'<' | b'^' => { @@ -378,7 +389,7 @@ impl<'a> Iterator for StatementSplitter<'a> { b'*' | b'%' | b'?' | b'{' | b'}' => Some(Err( StatementError::IllegalCommandName(String::from(output)), )), - _ => Some(Ok(StatementVariant::Default(output))), + _ => Some(Ok(self.get_statement_from(output))), } } } -- GitLab