const booleans = require('boolean-parser')
const MathParser = require("expr-eval").Parser
const s160Parser = new MathParser({
add: true,
concatenate: true,
conditional: true,
divide: true,
factorial: true,
multiply: true,
power: true,
remainder: true,
subtract: true,
logical: false, // handled by boolean-parser
comparison: true
})
const strToNum = require('parse-decimal-number')
console.log(s160Parser.evaluate('false'))
const variables = {
// Structured purely for demo purposes
questions: {
q1: {
text: 'Birth year?',
answers: {
'-1': 'refused',
'0': 'under 18',
'1': '18+'
},
answer: 1
}
},
data: {
gender: 'male',
children: 4
}
}
// READ HANDWRITTEN LOGIC FROM SCRIPT
const query = '{children} > 0 AND ([q1] == 1 OR [q1] == -1)'
// has children according to data on file, and indicated is over 18 or refused to give age
// PARSE VARIABLES
const parsedQuery = query.replace(/\{([^\{\}]+)\}/g, replaceDataVariable) // matches {...}
.replace(/\[([^\[\]]+)\]/g, replaceAnswerVariable) // matches [...]
function replaceDataVariable(match, key) {
// key = text between {curly braces} (first regex paren match)
return variables.data[key]
}
function replaceAnswerVariable(match, questionID) {
// questionID = text between [square braces] (first regex paren match)
return variables.questions[questionID].answer
}
// RUN COMPARISONS
const possiblePositives = booleans.parseBooleanQuery(parsedQuery)
possiblePositives.forEach(comparisons => {
const boolArray = comparisons.map(comparison => s160Parser.evaluate(comparison))
console.log(boolArray)
if (boolArray.every(bool => bool)) {
console.log('Pass! (Overrides any Fails)')
} else {
console.log('Fail.')
}
// TODO use loop not forEach; I gotta break out upon first Pass
})