()
| 293 | } |
| 294 | |
| 295 | func (p *parser) parseAtom() (*Constraint, error) { |
| 296 | a, start, err := p.atomWords() |
| 297 | if err != nil { |
| 298 | return nil, err |
| 299 | } |
| 300 | faultToken := func() token { |
| 301 | return token{ |
| 302 | typ: tokenError, |
| 303 | val: a.String(), |
| 304 | start: start, |
| 305 | } |
| 306 | } |
| 307 | var c *Constraint |
| 308 | for _, k := range keywords { |
| 309 | matched, err := k.Match(a) |
| 310 | if err != nil { |
| 311 | return nil, newParseExpError(err.Error(), faultToken()) |
| 312 | } |
| 313 | if matched { |
| 314 | c, err = k.Predicate(p.ctx, a.args) |
| 315 | if err != nil { |
| 316 | return nil, newParseExpError(err.Error(), faultToken()) |
| 317 | } |
| 318 | return c, nil |
| 319 | } |
| 320 | } |
| 321 | t := faultToken() |
| 322 | err = newParseExpError(fmt.Sprintf("Unknown search predicate: %q", t.val), t) |
| 323 | log.Printf("parsing search expression atom: %v", err) |
| 324 | return nil, err |
| 325 | } |
| 326 | |
| 327 | func parseExpression(ctx context.Context, exp string) (*SearchQuery, error) { |
| 328 | base := &Constraint{ |
no test coverage detected