(span Span)
| 844 | } |
| 845 | |
| 846 | func (o UnaryOperation) execute(span Span) (Static, error) { |
| 847 | static, err := o.Expression.execute(span) |
| 848 | if err != nil { |
| 849 | return NewStaticNil(), err |
| 850 | } |
| 851 | |
| 852 | if o.Op == OpNot { |
| 853 | if static.Type != TypeBoolean { |
| 854 | return NewStaticNil(), fmt.Errorf("expression (%v) expected a boolean, but got %v", o, static.Type) |
| 855 | } |
| 856 | b, _ := static.Bool() |
| 857 | return NewStaticBool(!b), nil |
| 858 | } |
| 859 | if o.Op == OpSub { |
| 860 | if !static.Type.isNumeric() { |
| 861 | return NewStaticNil(), fmt.Errorf("expression (%v) expected a numeric, but got %v", o, static.Type) |
| 862 | } |
| 863 | switch static.Type { |
| 864 | case TypeInt: |
| 865 | n, _ := static.Int() |
| 866 | return NewStaticInt(-1 * n), nil |
| 867 | case TypeFloat: |
| 868 | return NewStaticFloat(-1 * static.Float()), nil |
| 869 | case TypeDuration: |
| 870 | d, _ := static.Duration() |
| 871 | return NewStaticDuration(-1 * d), nil |
| 872 | } |
| 873 | } |
| 874 | if o.Op == OpExists { |
| 875 | return NewStaticBool(static.Type != TypeNil), nil |
| 876 | } |
| 877 | if o.Op == OpNotExists { |
| 878 | staticNilString := NewStaticString("nil") |
| 879 | return NewStaticBool(static.Equals(&staticNilString)), nil |
| 880 | } |
| 881 | |
| 882 | return NewStaticNil(), fmt.Errorf("UnaryOperation has invalid operator %v", o.Op) |
| 883 | } |
| 884 | |
| 885 | func (s Static) execute(Span) (Static, error) { |
| 886 | return s, nil |
no test coverage detected