func walkTernary(ctx expr.EvalContext, node *expr.TriNode, depth int) (value.Value, bool) {

	a, aok := Eval(ctx, node.Args[0])
	b, bok := Eval(ctx, node.Args[1])
	c, cok := Eval(ctx, node.Args[2])
	if !aok {
		return nil, false
	}
	if !bok || !cok {
		return nil, false
	}
	if a == nil || b == nil || c == nil {
		return nil, false
	}
	switch node.Operator.T {
	case lex.TokenBetween:
		switch at := a.(type) {
		case value.IntValue:

			av := at.Val()
			bv, ok := value.ValueToInt64(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToInt64(c)
			if !ok {
				return nil, false
			}
			if av > bv && av < cv {
				return value.NewBoolValue(true), true
			}

			return value.NewBoolValue(false), true
		case value.NumberValue:

			av := at.Val()
			bv, ok := value.ValueToFloat64(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToFloat64(c)
			if !ok {
				return nil, false
			}
			if av > bv && av < cv {
				return value.NewBoolValue(true), true
			}

			return value.NewBoolValue(false), true

		case value.TimeValue:

			av := at.Val()
			bv, ok := value.ValueToTime(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToTime(c)
			if !ok {
				return nil, false
			}
			if av.Unix() > bv.Unix() && av.Unix() < cv.Unix() {
				return value.NewBoolValue(true), true
			}

			return value.NewBoolValue(false), true

		default:
			u.Warnf("between not implemented for type %s %#v", a.Type().String(), node)
		}
	default:
		u.Warnf("ternary node walk not implemented for node %#v", node)
	}

	return nil, false
}
// walkTernary ternary evaluator
//
//     A   BETWEEN   B  AND C
//
walkTernary ternary evaluator

A   BETWEEN   B  AND C
// walkTernary ternary evaluator // // A BETWEEN B AND C //
func walkTernary(ctx expr.EvalContext, node *expr.TriNode, depth int) (value.Value, bool) {
	a, aok := Eval(ctx, node.Args[0])
	b, bok := Eval(ctx, node.Args[1])
	c, cok := Eval(ctx, node.Args[2])
	if !aok {
		return nil, false
	}
	if !bok || !cok {
		return nil, false
	}
	if a == nil || b == nil || c == nil {
		return nil, false
	}
	switch node.Operator.T {
	case lex.TokenBetween:
		switch at := a.(type) {
		case value.IntValue:
			av := at.Val()
			bv, ok := value.ValueToInt64(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToInt64(c)
			if !ok {
				return nil, false
			}
			if av > bv && av < cv {
				return value.NewBoolValue(true), true
			}
			return value.NewBoolValue(false), true
		case value.NumberValue:
			av := at.Val()
			bv, ok := value.ValueToFloat64(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToFloat64(c)
			if !ok {
				return nil, false
			}
			if av > bv && av < cv {
				return value.NewBoolValue(true), true
			}
			return value.NewBoolValue(false), true
		case value.TimeValue:
			av := at.Val()
			bv, ok := value.ValueToTime(b)
			if !ok {
				return nil, false
			}
			cv, ok := value.ValueToTime(c)
			if !ok {
				return nil, false
			}
			if av.Unix() > bv.Unix() && av.Unix() < cv.Unix() {
				return value.NewBoolValue(true), true
			}
			return value.NewBoolValue(false), true
		default:
			u.Warnf("between not implemented for type %s %#v", a.Type().String(), node)
		}
	default:
		u.Warnf("ternary node walk not implemented for node %#v", node)
	}
	return nil, false
}
func walkTernary ( ctx expr . EvalContext , node * expr . TriNode , depth int ) ( value . Value , bool ) { a , aok := Eval ( ctx , node . Args [ 0 ] ) b , bok := Eval ( ctx , node . Args [ 1 ] ) c , cok := Eval ( ctx , node . Args [ 2 ] ) if ! aok { return nil , false } if ! bok || ! cok { return nil , false } if a == nil || b == nil || c == nil { return nil , false } switch node . Operator . T { case lex . TokenBetween : switch at := a . ( type ) { case value . IntValue : av := at . Val ( ) bv , ok := value . ValueToInt64 ( b ) if ! ok { return nil , false } cv , ok := value . ValueToInt64 ( c ) if ! ok { return nil , false } if av > bv && av < cv { return value . NewBoolValue ( true ) , true } return value . NewBoolValue ( false ) , true case value . NumberValue : av := at . Val ( ) bv , ok := value . ValueToFloat64 ( b ) if ! ok { return nil , false } cv , ok := value . ValueToFloat64 ( c ) if ! ok { return nil , false } if av > bv && av < cv { return value . NewBoolValue ( true ) , true } return value . NewBoolValue ( false ) , true case value . TimeValue : av := at . Val ( ) bv , ok := value . ValueToTime ( b ) if ! ok { return nil , false } cv , ok := value . ValueToTime ( c ) if ! ok { return nil , false } if av . Unix ( ) > bv . Unix ( ) && av . Unix ( ) < cv . Unix ( ) { return value . NewBoolValue ( true ) , true } return value . NewBoolValue ( false ) , true default : u . Warnf ( " " , a . Type ( ) . String ( ) , node ) } default : u . Warnf ( " " , node ) } return nil , false }
walkTernary ternary evaluator
walkTernary ternary evaluator