Parse parse a query DSL Ex: "status:open author:descartes sort:edit-asc" Supported filter qualifiers and syntax are described in docs/queries.md
(query string)
| 12 | // |
| 13 | // Supported filter qualifiers and syntax are described in docs/queries.md |
| 14 | func Parse(query string) (*Query, error) { |
| 15 | tokens, err := tokenize(query) |
| 16 | if err != nil { |
| 17 | return nil, err |
| 18 | } |
| 19 | |
| 20 | q := &Query{ |
| 21 | OrderBy: OrderByCreation, |
| 22 | OrderDirection: OrderDescending, |
| 23 | } |
| 24 | sortingDone := false |
| 25 | |
| 26 | for _, t := range tokens { |
| 27 | switch t.kind { |
| 28 | case tokenKindSearch: |
| 29 | q.Search = append(q.Search, t.term) |
| 30 | break |
| 31 | |
| 32 | case tokenKindKV: |
| 33 | switch t.qualifier { |
| 34 | case "status", "state": |
| 35 | status, err := common.StatusFromString(t.value) |
| 36 | if err != nil { |
| 37 | return nil, err |
| 38 | } |
| 39 | q.Status = append(q.Status, status) |
| 40 | case "author": |
| 41 | q.Author = append(q.Author, t.value) |
| 42 | case "actor": |
| 43 | q.Actor = append(q.Actor, t.value) |
| 44 | case "participant": |
| 45 | q.Participant = append(q.Participant, t.value) |
| 46 | case "label": |
| 47 | q.Label = append(q.Label, t.value) |
| 48 | case "title": |
| 49 | q.Title = append(q.Title, t.value) |
| 50 | case "no": |
| 51 | switch t.value { |
| 52 | case "label": |
| 53 | q.NoLabel = true |
| 54 | default: |
| 55 | return nil, fmt.Errorf("unknown \"no\" filter \"%s\"", t.value) |
| 56 | } |
| 57 | case "sort": |
| 58 | if sortingDone { |
| 59 | return nil, fmt.Errorf("multiple sorting") |
| 60 | } |
| 61 | err = parseSorting(q, t.value) |
| 62 | if err != nil { |
| 63 | return nil, err |
| 64 | } |
| 65 | sortingDone = true |
| 66 | |
| 67 | default: |
| 68 | return nil, fmt.Errorf("unknown qualifier \"%s\"", t.qualifier) |
| 69 | } |
| 70 | |
| 71 | case tokenKindKVV: |