From 05771c7221498920319614608af6881225c50db4 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 17 Apr 2019 20:48:28 -0500 Subject: [PATCH] FIX: Selects nested in tuples with no defaults didn't parse. fixes #40 --- integration_tests/select_expressions_test.ucg | 27 +++++++++++++++++++ src/parse/mod.rs | 23 +++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/integration_tests/select_expressions_test.ucg b/integration_tests/select_expressions_test.ucg index 4b70286..292f6fe 100644 --- a/integration_tests/select_expressions_test.ucg +++ b/integration_tests/select_expressions_test.ucg @@ -67,4 +67,31 @@ assert { assert { ok = no_default_test(false) == "I was false", desc = "no default successfully detects false", +}; + +let tpl_fields = { + test = "foo", +}; + +let no_default_select_result = select tpl_fields.test == "foo", { + true = true, + false = false, +}; + +assert { + ok = no_default_select_result, + desc = "no default successfully select true", +}; + +let nested_select_result_no_defaults = select true, { + true = true, + false = select false, { + true = fail "whoops! this should never have triggered.", + false = true, + }, +}; + +assert { + ok = nested_select_result_no_defaults, + desc = "Nested select result parses and resturns true", }; \ No newline at end of file diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 8dc4b66..c942ff1 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -467,13 +467,22 @@ fn select_expression(input: SliceIter) -> Result, Expres _ => must!(punct!(",")), (expr) ), - default => optional!(do_each!( - expr => trace_parse!(must!(expression)), - _ => punct!(","), - (expr) - )), - map => trace_parse!(must!(tuple)), - (val, default, map) + default_and_map => either!( + do_each!( + default => do_each!( + expr => trace_parse!(expression), + _ => punct!(","), + (expr) + ), + map => trace_parse!(tuple), + (Some(default), map) + ), + do_each!( + map => trace_parse!(must!(tuple)), + (None, map) + ) + ), + (val, default_and_map.0, default_and_map.1) ); match parsed { Result::Abort(e) => Result::Abort(e),