1package query
2
3import (
4 "fmt"
5
6 "github.com/MichaelMure/git-bug/bug"
7)
8
9// Parse parse a query DSL
10//
11// Ex: "status:open author:descartes sort:edit-asc"
12//
13// Supported filter qualifiers and syntax are described in docs/queries.md
14func 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.qualifier {
28 case "status", "state":
29 status, err := bug.StatusFromString(t.value)
30 if err != nil {
31 return nil, err
32 }
33 q.Status = append(q.Status, status)
34 case "author":
35 q.Author = append(q.Author, t.value)
36 case "actor":
37 q.Actor = append(q.Actor, t.value)
38 case "participant":
39 q.Participant = append(q.Participant, t.value)
40 case "label":
41 q.Label = append(q.Label, t.value)
42 case "title":
43 q.Title = append(q.Title, t.value)
44 case "no":
45 switch t.value {
46 case "label":
47 q.NoLabel = true
48 default:
49 return nil, fmt.Errorf("unknown \"no\" filter \"%s\"", t.value)
50 }
51 case "sort":
52 if sortingDone {
53 return nil, fmt.Errorf("multiple sorting")
54 }
55 err = parseSorting(q, t.value)
56 if err != nil {
57 return nil, err
58 }
59 sortingDone = true
60
61 default:
62 return nil, fmt.Errorf("unknown qualifier \"%s\"", t.qualifier)
63 }
64 }
65 return q, nil
66}
67
68func parseSorting(q *Query, value string) error {
69 switch value {
70 // default ASC
71 case "id-desc":
72 q.OrderBy = OrderById
73 q.OrderDirection = OrderDescending
74 case "id", "id-asc":
75 q.OrderBy = OrderById
76 q.OrderDirection = OrderAscending
77
78 // default DESC
79 case "creation", "creation-desc":
80 q.OrderBy = OrderByCreation
81 q.OrderDirection = OrderDescending
82 case "creation-asc":
83 q.OrderBy = OrderByCreation
84 q.OrderDirection = OrderAscending
85
86 // default DESC
87 case "edit", "edit-desc":
88 q.OrderBy = OrderByEdit
89 q.OrderDirection = OrderDescending
90 case "edit-asc":
91 q.OrderBy = OrderByEdit
92 q.OrderDirection = OrderAscending
93
94 default:
95 return fmt.Errorf("unknown sorting %s", value)
96 }
97
98 return nil
99}