// Count func CountFunc(ctx EvalContext, val value.Value) (value.IntValue, bool) { if val.Err() || val.Nil() { return value.NewIntValue(0), false } //u.Infof("??? vals=[%v]", val.Value()) return value.NewIntValue(1), true }
// HashSha512Func Hash a value to SHA512 string // // hash.sha512("/blog/index.html") => abc345xyz // func HashSha512Func(ctx expr.EvalContext, arg value.Value) (value.StringValue, bool) { if arg.Err() || arg.Nil() { return value.EmptyStringValue, true } hasher := sha512.New() hasher.Write([]byte(arg.ToString())) return value.NewStringValue(hex.EncodeToString(hasher.Sum(nil))), true }
// Map() Create a map from two values. If the right side value is nil // then does not evaluate // // Map(left, right) => map[string]value{left:right} // func MapFunc(ctx expr.EvalContext, lv, rv value.Value) (value.MapValue, bool) { if lv.Err() || rv.Err() { return value.EmptyMapValue, false } if lv.Nil() || rv.Nil() { return value.EmptyMapValue, false } return value.NewMapValue(map[string]interface{}{lv.ToString(): rv.Value()}), true }
// Sqrt // // sqrt(4) => 2, true // sqrt(9) => 3, true // sqrt(not_number) => 0, false // func SqrtFunc(ctx expr.EvalContext, val value.Value) (value.NumberValue, bool) { nv, ok := val.(value.NumericValue) if !ok { return value.NewNumberValue(math.NaN()), false } if val.Err() || val.Nil() { return value.NewNumberValue(0), false } fv := nv.Float() fv = math.Sqrt(fv) //u.Infof("??? vals=[%v]", val.Value()) return value.NewNumberValue(fv), true }
// Pow func PowFunc(ctx EvalContext, val, toPower value.Value) (value.NumberValue, bool) { //Pow(x, y float64) float64 //u.Infof("powFunc: %T:%v %T:%v ", val, val.Value(), toPower, toPower.Value()) if val.Err() || val.Nil() { return value.NewNumberValue(0), false } if toPower.Err() || toPower.Nil() { return value.NewNumberValue(0), false } fv, pow := value.ToFloat64(val.Rv()), value.ToFloat64(toPower.Rv()) if fv == math.NaN() || pow == math.NaN() { return value.NewNumberValue(0), false } fv = math.Pow(fv, pow) //u.Infof("pow ??? vals=[%v]", fv, pow) return value.NewNumberValue(fv), true }
// Count: This should be renamed Increment // and in general is a horrible, horrible function that needs to be replaced // with occurences of value, ignores the value and ensures it is non null // // count(anyvalue) => 1, true // count(not_number) => -- 0, false // func CountFunc(ctx expr.EvalContext, val value.Value) (value.IntValue, bool) { if val.Err() || val.Nil() { return value.NewIntValue(0), false } return value.NewIntValue(1), true }