Skip to content

Commit 86112f2

Browse files
committed
Interactive api command
1 parent 93de4d4 commit 86112f2

File tree

7 files changed

+619
-5
lines changed

7 files changed

+619
-5
lines changed

api/queries_pr.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,8 @@ func PullRequests(client *Client, repo ghrepo.Interface, currentPRNumber int, cu
395395
queryPrefix := `
396396
query PullRequestStatus($owner: String!, $repo: String!, $headRefName: String!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
397397
repository(owner: $owner, name: $repo) {
398-
defaultBranchRef {
399-
name
398+
defaultBranchRef {
399+
name
400400
}
401401
pullRequests(headRefName: $headRefName, first: $per_page, orderBy: { field: CREATED_AT, direction: DESC }) {
402402
totalCount
@@ -412,8 +412,8 @@ func PullRequests(client *Client, repo ghrepo.Interface, currentPRNumber int, cu
412412
queryPrefix = `
413413
query PullRequestStatus($owner: String!, $repo: String!, $number: Int!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
414414
repository(owner: $owner, name: $repo) {
415-
defaultBranchRef {
416-
name
415+
defaultBranchRef {
416+
name
417417
}
418418
pullRequest(number: $number) {
419419
...prWithReviews

pkg/cmd/api/api.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ func NewCmdApi(f *cmdutil.Factory, runF func(*ApiOptions) error) *cobra.Command
179179
return cmd
180180
}
181181

182+
func IapiRun(opts *ApiOptions) error {
183+
return apiRun(opts)
184+
}
185+
182186
func apiRun(opts *ApiOptions) error {
183187
params, err := parseFields(opts)
184188
if err != nil {
@@ -300,7 +304,7 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream
300304
}
301305

302306
if isJSON && opts.IO.ColorEnabled() {
303-
err = jsoncolor.Write(opts.IO.Out, responseBody, " ")
307+
err = jsoncolor.Write(os.Stdout, responseBody, " ")
304308
} else {
305309
_, err = io.Copy(opts.IO.Out, responseBody)
306310
}

pkg/cmd/iapi/builder.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package iapi
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
)
8+
9+
type QueryBuilder interface {
10+
ParentNode() *Node
11+
CurrentNode() *Node
12+
ChildNodes() []*Node
13+
AllNodes() []*Node
14+
FieldNodes() []*Node
15+
ArgumentNodes() []*Node
16+
FindNode(string) *Node
17+
Generate() string
18+
}
19+
20+
// AddNode(string) *Node
21+
// AddArgument(string, string)
22+
// AddArguments(map[string]string)
23+
// AddKind(string)
24+
// AddArgumentsAvailable(bool)
25+
// AddFieldsAvailable(bool)
26+
27+
type Node struct {
28+
Name string
29+
Kind string
30+
Parent *Node
31+
Nodes []*Node
32+
Arguments map[string]string
33+
34+
ArgumentsAvailable bool
35+
FieldsAvailable bool
36+
}
37+
38+
func NewQueryBuilder(name string) QueryBuilder {
39+
return &Node{Name: name, Kind: name, Nodes: []*Node{}, Arguments: map[string]string{}}
40+
}
41+
42+
func (n *Node) ParentNode() *Node {
43+
return n.Parent
44+
}
45+
46+
func (n *Node) CurrentNode() *Node {
47+
return n
48+
}
49+
50+
func (n *Node) ChildNodes() []*Node {
51+
return n.Nodes
52+
}
53+
54+
func (n *Node) AllNodes() []*Node {
55+
var ns []*Node
56+
ns = append(ns, n)
57+
for _, cn := range n.ChildNodes() {
58+
ns = append(ns, cn.AllNodes()...)
59+
}
60+
return ns
61+
}
62+
63+
func (n *Node) FieldNodes() []*Node {
64+
nodes := []*Node{}
65+
for _, nn := range n.AllNodes() {
66+
if nn.FieldsAvailable {
67+
nodes = append(nodes, nn)
68+
}
69+
}
70+
return nodes
71+
}
72+
73+
func (n *Node) ArgumentNodes() []*Node {
74+
nodes := []*Node{}
75+
for _, nn := range n.AllNodes() {
76+
if nn.ArgumentsAvailable {
77+
nodes = append(nodes, nn)
78+
}
79+
}
80+
return nodes
81+
}
82+
83+
func (n *Node) FindNode(name string) *Node {
84+
for _, s := range n.AllNodes() {
85+
if s.Name == name {
86+
return s
87+
}
88+
}
89+
return nil
90+
}
91+
92+
func (n *Node) AddArgument(key string, value string) {
93+
n.Arguments[key] = value
94+
}
95+
96+
func (n *Node) AddArguments(args map[string]string) {
97+
n.Arguments = args
98+
}
99+
100+
func (n *Node) AddKind(k string) {
101+
n.Kind = k
102+
}
103+
104+
func (n *Node) ArgumentsToString() string {
105+
if len(n.Arguments) == 0 {
106+
return ""
107+
}
108+
var args []string
109+
for k, v := range n.Arguments {
110+
if _, err := strconv.Atoi(v); err == nil {
111+
args = append(args, fmt.Sprintf("%s:%s", k, v))
112+
} else {
113+
args = append(args, fmt.Sprintf("%s:\"%s\"", k, v))
114+
}
115+
}
116+
return fmt.Sprintf("(%s)", strings.Join(args, ", "))
117+
}
118+
119+
func (n *Node) AddNode(name string) *Node {
120+
nn := Node{Name: name, Kind: name, Parent: n, Nodes: []*Node{}, Arguments: map[string]string{}}
121+
n.Nodes = append(n.Nodes, &nn)
122+
return &nn
123+
}
124+
125+
func (n *Node) AddArgumentsAvailable(b bool) {
126+
n.ArgumentsAvailable = b
127+
}
128+
129+
func (n *Node) AddFieldsAvailable(b bool) {
130+
n.FieldsAvailable = b
131+
}
132+
133+
func (n *Node) Generate() string {
134+
var b strings.Builder
135+
fmt.Fprintf(&b, "query {")
136+
n.generate(&b)
137+
fmt.Fprintf(&b, "}")
138+
return b.String()
139+
}
140+
141+
func (n *Node) generate(b *strings.Builder) {
142+
fmt.Fprintf(b, " %s", n.Name)
143+
fmt.Fprintf(b, n.ArgumentsToString())
144+
if len(n.Nodes) > 0 {
145+
fmt.Fprintf(b, "{")
146+
for _, v := range n.Nodes {
147+
v.generate(b)
148+
}
149+
fmt.Fprintf(b, " }")
150+
}
151+
}

0 commit comments

Comments
 (0)