forked from cli/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquery.go
More file actions
138 lines (128 loc) · 2.78 KB
/
query.go
File metadata and controls
138 lines (128 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package search
import (
"fmt"
"reflect"
"sort"
"strings"
"github.com/cli/cli/v2/pkg/text"
)
const (
KindRepositories = "repositories"
KindIssues = "issues"
)
type Query struct {
Keywords []string
Kind string
Limit int
Order string
Page int
Qualifiers Qualifiers
Sort string
}
type Qualifiers struct {
Archived *bool
Assignee string
Author string
Base string
Closed string
Commenter string
Comments string
Created string
Draft *bool
Followers string
Fork string
Forks string
GoodFirstIssues string
Head string
HelpWantedIssues string
In []string
Interactions string
Involves string
Is []string
Label []string
Language string
License []string
Mentions string
Merged string
Milestone string
No []string
Org string
Project string
Pushed string
Reactions string
Repo []string
Review string
ReviewRequested string
ReviewedBy string
Size string
Stars string
State string
Status string
Team string
Topic []string
Topics string
Type string
Updated string
}
func (q Query) String() string {
qualifiers := formatQualifiers(q.Qualifiers)
keywords := formatKeywords(q.Keywords)
all := append(keywords, qualifiers...)
return strings.Join(all, " ")
}
func (q Qualifiers) Map() map[string][]string {
m := map[string][]string{}
v := reflect.ValueOf(q)
t := reflect.TypeOf(q)
for i := 0; i < v.NumField(); i++ {
fieldName := t.Field(i).Name
key := text.CamelToKebab(fieldName)
typ := v.FieldByName(fieldName).Kind()
value := v.FieldByName(fieldName)
switch typ {
case reflect.Ptr:
if value.IsNil() {
continue
}
v := reflect.Indirect(value)
m[key] = []string{fmt.Sprintf("%v", v)}
case reflect.Slice:
if value.IsNil() {
continue
}
s := []string{}
for i := 0; i < value.Len(); i++ {
s = append(s, fmt.Sprintf("%v", value.Index(i)))
}
m[key] = s
default:
if value.IsZero() {
continue
}
m[key] = []string{fmt.Sprintf("%v", value)}
}
}
return m
}
func quote(s string) string {
if strings.ContainsAny(s, " \"\t\r\n") {
return fmt.Sprintf("%q", s)
}
return s
}
func formatQualifiers(qs Qualifiers) []string {
var all []string
for k, vs := range qs.Map() {
for _, v := range vs {
all = append(all, fmt.Sprintf("%s:%s", k, quote(v)))
}
}
sort.Strings(all)
return all
}
func formatKeywords(ks []string) []string {
for i, k := range ks {
ks[i] = quote(k)
}
return ks
}