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),