func roundFloat64(x exact.Value) exact.Value { f, _ := exact.Float64Val(x) if !math.IsInf(f, 0) { return exact.MakeFloat64(f) } return nil }
func roundFloat32(x exact.Value) exact.Value { f32, _ := exact.Float32Val(x) f := float64(f32) if !math.IsInf(f, 0) { return exact.MakeFloat64(f) } return nil }
func (r *Rule) evaluate(d float64) (bool, error) { pkg := types.NewPackage("evaluateme", "evaluateme") v := exact.MakeFloat64(d) pkg.Scope().Insert(types.NewConst(0, pkg, "x", types.Typ[types.Float64], v)) tv, err := types.Eval(token.NewFileSet(), pkg, token.NoPos, r.Condition) if err != nil { return false, fmt.Errorf("Failed to evaluate condition %q: %s", r.Condition, err) } if tv.Type.String() != "untyped bool" { return false, fmt.Errorf("Rule \"%v\" does not return boolean type.", r.Condition) } return exact.BoolVal(tv.Value), nil }