parser.go

 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}