FEATURE: Allow filtrator expressions to return boolean.

Also a bugfix where we were accidentally mapping instead of filtering.
This commit is contained in:
Jeremy Wall 2018-08-22 18:56:12 -05:00
parent 8d3ab20f5c
commit f982194518
2 changed files with 16 additions and 6 deletions

View File

@ -8,6 +8,10 @@ let filtrator = macro(item) => {
}, },
}; };
let boolfiltrator = macro(item) => {
result = item < 5,
};
assert |map mapper.result list1 == [2, 3, 4, 5]|; assert |map mapper.result list1 == [2, 3, 4, 5]|;
assert |(map mapper.result [1, 2, 3, 4]) == [2, 3, 4, 5]|; assert |(map mapper.result [1, 2, 3, 4]) == [2, 3, 4, 5]|;
assert |map mapper.result [1, 2, 3, 4] == [2, 3, 4, 5]|; assert |map mapper.result [1, 2, 3, 4] == [2, 3, 4, 5]|;
@ -15,3 +19,4 @@ assert |map mapper.result [1, 2, 3, 4] == [2, 3, 4, 5]|;
assert |filter filtrator.result list2 == ["foo", "foo"]|; assert |filter filtrator.result list2 == ["foo", "foo"]|;
assert |(filter filtrator.result ["foo", "bar", "foo", "bar"]) == ["foo", "foo"]|; assert |(filter filtrator.result ["foo", "bar", "foo", "bar"]) == ["foo", "foo"]|;
assert |filter filtrator.result ["foo", "bar", "foo", "bar"] == ["foo", "foo"]|; assert |filter filtrator.result ["foo", "bar", "foo", "bar"] == ["foo", "foo"]|;
assert |filter boolfiltrator.result [1, 2, 3, 4, 5, 6, 7] == [1, 2, 3, 4]|;

View File

@ -1151,8 +1151,8 @@ impl<'a> Builder<'a> {
let mac = &def.mac; let mac = &def.mac;
if let &Val::Macro(ref macdef) = try!(self.lookup_selector(&mac.sel)).as_ref() { if let &Val::Macro(ref macdef) = try!(self.lookup_selector(&mac.sel)).as_ref() {
let mut out = Vec::new(); let mut out = Vec::new();
for expr in l.iter() { for item in l.iter() {
let argvals = vec![expr.clone()]; let argvals = vec![item.clone()];
let fields = try!(macdef.eval( let fields = try!(macdef.eval(
self.root.clone(), self.root.clone(),
self.assets.clone(), self.assets.clone(),
@ -1168,8 +1168,11 @@ impl<'a> Builder<'a> {
if let &Val::Empty = v.as_ref() { if let &Val::Empty = v.as_ref() {
// noop // noop
continue; continue;
} else if let &Val::Boolean(false) = v.as_ref() {
// noop
continue;
} }
out.push(v.clone()); out.push(item.clone());
} }
} }
} }
@ -1225,9 +1228,11 @@ impl<'a> Builder<'a> {
} else { } else {
// record an assertion type-failure result. // record an assertion type-failure result.
let msg = format!( let msg = format!(
"TYPE FAIL - '{}' at line: {} column: {}\n", "TYPE FAIL - '{}' Expected Boolean got {} at line: {} column: {}\n",
expr, tok.pos.line, tok.pos.column expr, ok, tok.pos.line, tok.pos.column
); );
self.assert_collector.failures.push_str(&msg);
self.assert_collector.success = false;
self.assert_collector.summary.push_str(&msg); self.assert_collector.summary.push_str(&msg);
} }
Ok(ok) Ok(ok)