// All: Answers True/False if all of the arguments evaluate to truish (javascripty) // type definintion of true // // int > 0 = true // string != "" = true // boolean natively supported true/false // // // all("hello",2, true) => true // all("hello",0,true) => false // all("",2, true) => false // func AllFunc(ctx expr.EvalContext, vals ...value.Value) (value.BoolValue, bool) { for _, v := range vals { if v.Err() || v.Nil() { return value.NewBoolValue(false), true } else if value.IsNilIsh(v.Rv()) { return value.NewBoolValue(false), true } if nv, ok := v.(value.NumericValue); ok { if iv := nv.Int(); iv < 0 { return value.NewBoolValue(false), true } continue } switch vt := v.(type) { case value.TimeValue: if vt.Val().IsZero() { return value.NewBoolValue(false), true } case value.BoolValue: if vt.Val() == false { return value.NewBoolValue(false), true } } } return value.NewBoolValue(true), true }
// choose OneOf these fields, first non-null func OneOfFunc(ctx expr.EvalContext, vals ...value.Value) (value.Value, bool) { for _, v := range vals { if v.Err() || v.Nil() { // continue, ignore } else if !value.IsNilIsh(v.Rv()) { return v, true } } return value.NilValueVal, true }
// Any: Answers True/False if any of the arguments evaluate to truish (javascripty) // type definintion of true // // int > 0 = true // string != "" = true // // // any(item,item2) => true, true // any(not_field) => false, true // func AnyFunc(ctx expr.EvalContext, vals ...value.Value) (value.BoolValue, bool) { for _, v := range vals { if v.Err() || v.Nil() { // continue } else if !value.IsNilIsh(v.Rv()) { return value.NewBoolValue(true), true } } return value.NewBoolValue(false), true }
// choose OneOf these fields, first non-null func OneOfFunc(e *State, vals ...value.Value) (value.Value, bool) { for _, v := range vals { if v.Err() || v.Nil() { // continue } else if !value.IsNilIsh(v.Rv()) { return v, true } } return value.EmptyStringValue, false }
// Replace a string(s), accepts any number of parameters to replace // replaces with "" // // replace("/blog/index.html", "/blog","M2") => /index.html // replace(item, "M") // func Replace(ctx expr.EvalContext, vals ...value.Value) (value.StringValue, bool) { if len(vals) < 2 { return value.EmptyStringValue, false } val1 := vals[0].ToString() for _, v := range vals[1:] { if v.Err() || v.Nil() { return value.EmptyStringValue, false } else if value.IsNilIsh(v.Rv()) { return value.EmptyStringValue, false } v2 := v.ToString() if len(v2) > 0 { val1 = strings.Replace(val1, v2, "", -1) } } return value.NewStringValue(val1), true }