// Equal function? returns true if items are equal // // eq(item,5) func Eq(ctx expr.EvalContext, itemA, itemB value.Value) (value.BoolValue, bool) { //return BoolValue(itemA == itemB) //rvb := value.CoerceTo(itemA.Rv(), itemB.Rv()) //u.Infof("Eq(): a:%T b:%T %v=%v?", itemA, itemB, itemA.Value(), rvb) //u.Infof("Eq()2: %T %T", itemA.Rv(), rvb) return value.NewBoolValue(reflect.DeepEqual(itemA.Value(), itemB.Value())), true }
// Convert to Number: Best attempt at converting to integer // // tonumber("5") => 5.0 // tonumber("5.75") => 5.75 // tonumber("5,555") => 5555 // tonumber("$5") => 5.00 // tonumber("5,555.00") => 5555 // func ToNumber(ctx expr.EvalContext, item value.Value) (value.NumberValue, bool) { fv, ok := value.ToFloat64(reflect.ValueOf(item.Value())) if !ok { return value.NewNumberValue(0), false } return value.NewNumberValue(fv), true }
// Convert to Integer: Best attempt at converting to integer // // toint("5") => 5 // toint("5.75") => 5 // toint("5,555") => 5555 // toint("$5") => 5 // toint("5,555.00") => 5555 // func ToInt(ctx expr.EvalContext, item value.Value) (value.IntValue, bool) { iv, ok := value.ToInt64(reflect.ValueOf(item.Value())) if !ok { return value.NewIntValue(0), false } return value.NewIntValue(iv), 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 }
// Convert to Integer: Best attempt at converting to integer // // toint("5") => 5, true // toint("5.75") => 5, true // toint("5,555") => 5555, true // toint("$5") => 5, true // toint("5,555.00") => 5555, true // func ToInt(ctx expr.EvalContext, item value.Value) (value.IntValue, bool) { switch itemT := item.(type) { case value.TimeValue: iv := itemT.Val().UnixNano() / 1e6 // Milliseconds return value.NewIntValue(iv), true } iv, ok := value.ToInt64(reflect.ValueOf(item.Value())) if !ok { return value.NewIntValue(0), false } return value.NewIntValue(iv), true }
func checkval(t *testing.T, r expr.ContextReader, key string, expected value.Value) { val, ok := r.Get(key) assert.Tf(t, ok, "expected key:%s =%v", key, expected.Value()) if val == nil { t.Errorf("not value for %v", key) } else { assert.Equalf(t, expected.Value(), val.Value(), "%s expected: %v got:%v", key, expected.Value(), val.Value()) } }
func ToInt(ctx expr.EvalContext, item value.Value) (value.IntValue, bool) { iv, _ := value.ToInt64(reflect.ValueOf(item.Value())) return value.NewIntValue(iv), true //return IntValue(2) }
func ToInt(e *State, item value.Value) (value.IntValue, bool) { iv, _ := value.ToInt64(reflect.ValueOf(item.Value())) return value.NewIntValue(iv), true //return IntValue(2) }