Managed to write a suitable macro, posting solution for completeness:
type DataTable = tuple
id : seq[int]
name : seq[string]
age: seq[Natural]
proc len(dt: DataTable) : Natural =
for f in fields(dt):
return f.len
return 0
macro injectTupleOrObject(t: typed, index:typed): typed =
var tType = t.getTypeImpl
case tType.typeKind:
of ntyTuple: discard
of ntyObject: tType = tType[2]
else: error "Not a tuple or object"
result = newNimNode(nnkLetSection)
for field in tType:
let dotExpr = newDotExpr(t, newIdentNode($field[0]))
let brkExpr = newNimNode(nnkBracketExpr).add(dotExpr, index)
result.add(newIdentDefs(ident($field[0]), newEmptyNode(), brkExpr))
template mask(dt : DataTable, expr : untyped) : seq[bool] =
var result = newSeq[bool](dt.len)
for i in 0 ..< dt.len:
injectTupleOrObject(dt, i)
result[i] = expr
result
echo mask(x, age >= 15 and isAlphaNumeric(name))