| 242 | } |
| 243 | |
| 244 | func (p *parser) parseUnary() (Value, error) { |
| 245 | ch := p.peek() |
| 246 | if ch == '!' { |
| 247 | p.pos++ |
| 248 | val, err := p.parseUnary() |
| 249 | if err != nil { |
| 250 | return Value{}, err |
| 251 | } |
| 252 | return BoolVal(!val.AsBool()), nil |
| 253 | } |
| 254 | if ch == '-' { |
| 255 | // Check it's not a two-char operator |
| 256 | if p.pos+1 < len(p.input) && p.input[p.pos+1] >= '0' && p.input[p.pos+1] <= '9' { |
| 257 | return p.parseAtom() |
| 258 | } |
| 259 | p.pos++ |
| 260 | val, err := p.parseUnary() |
| 261 | if err != nil { |
| 262 | return Value{}, err |
| 263 | } |
| 264 | if val.Type == workflowapi.Float { |
| 265 | return FloatVal(-val.AsFloat()), nil |
| 266 | } |
| 267 | return IntVal(-val.AsInt()), nil |
| 268 | } |
| 269 | return p.parseAtom() |
| 270 | } |
| 271 | |
| 272 | func (p *parser) parseAtom() (Value, error) { |
| 273 | p.skipWhitespace() |