in newt/parse/parse.go [510:597]
func Eval(expr *Node, settings *cfgv.Settings) (bool, error) {
// The null expression is true by default.
if expr == nil {
return true, nil
}
switch expr.Code {
case PARSE_NOT:
r, err := Eval(expr.Right, settings)
if err != nil {
return false, err
}
return !r, nil
case PARSE_EQUALS:
return evalEquals(expr.Left, expr.Right, settings)
case PARSE_NOT_EQUALS:
v, err := evalEquals(expr.Left, expr.Right, settings)
if err != nil {
return false, err
}
return !v, nil
case PARSE_LT:
l, r, err := coerceTwoInts(expr.Left, expr.Right, settings, "<")
if err != nil {
return false, err
}
return l < r, nil
case PARSE_LTE:
l, r, err := coerceTwoInts(expr.Left, expr.Right, settings, "<=")
if err != nil {
return false, err
}
return l <= r, nil
case PARSE_GT:
l, r, err := coerceTwoInts(expr.Left, expr.Right, settings, ">")
if err != nil {
return false, err
}
return l > r, nil
case PARSE_GTE:
l, r, err := coerceTwoInts(expr.Left, expr.Right, settings, ">=")
if err != nil {
return false, err
}
return l >= r, nil
case PARSE_AND:
l, r, err := evalTwo(expr.Left, expr.Right, settings)
if err != nil {
return false, err
}
return l && r, nil
case PARSE_OR:
l, r, err := evalTwo(expr.Left, expr.Right, settings)
if err != nil {
return false, err
}
return l || r, nil
case PARSE_XOR:
l, r, err := evalTwo(expr.Left, expr.Right, settings)
if err != nil {
return false, err
}
return (l && !r) || (!l && r), nil
case PARSE_NUMBER:
num, ok := util.AtoiNoOctTry(expr.Data)
return ok && num != 0, nil
case PARSE_STRING:
return ValueIsTrue(expr.Data), nil
case PARSE_IDENT:
val := settings.Get(expr.Data)
return ValueIsTrue(val), nil
default:
return false, fmt.Errorf("invalid parse code: %d", expr.Code)
}
}