From cb11f042abe8c5b24d279d79ba262077b36803e2 Mon Sep 17 00:00:00 2001 From: JT Date: Sat, 31 Jul 2021 17:20:40 +1200 Subject: [PATCH] Start env shorthand --- src/main.rs | 2 +- src/parser.rs | 25 +++++++++++++++++++++++-- src/tests.rs | 5 +++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7aad256c4..86f8e44c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -192,7 +192,7 @@ fn main() -> std::io::Result<()> { ); if let Some(err) = err { eprintln!("Parse Error: {:?}", err); - break; + continue; } (output, working_set.render()) }; diff --git a/src/parser.rs b/src/parser.rs index 1ed0835c6..12a369d4e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -783,11 +783,32 @@ impl<'a> ParserWorkingSet<'a> { pub fn parse_call(&mut self, spans: &[Span]) -> (Expression, Option) { // assume spans.len() > 0? - let name = self.get_span_contents(spans[0]); + let mut pos = 0; + let mut shorthand = vec![]; + + while pos < spans.len() { + // First, check if there is any environment shorthand + let name = self.get_span_contents(spans[pos]); + let split: Vec<_> = name.splitn(2, |x| *x == b'=').collect(); + if split.len() == 2 { + shorthand.push(split); + pos += 1; + } else { + break; + } + } + + if pos == spans.len() { + return ( + Expression::garbage(span(spans)), + Some(ParseError::UnknownCommand(spans[0])), + ); + } + let name = self.get_span_contents(spans[pos]); + pos += 1; if let Some(mut decl_id) = self.find_decl(name) { let mut name = name.to_vec(); - let mut pos = 1; while pos < spans.len() { // look to see if it's a subcommand let mut new_name = name.to_vec(); diff --git a/src/tests.rs b/src/tests.rs index 665930f04..d620c46fb 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -123,3 +123,8 @@ fn predecl_check() -> TestResult { fn def_with_no_dollar() -> TestResult { run_test("def bob [x] { $x + 3 }; bob 4", "7") } + +#[test] +fn env_shorthand() -> TestResult { + run_test("FOO=BAR if $false { 3 } else { 4 }", "4") +}