-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
146 lines (128 loc) · 3.47 KB
/
main.go
File metadata and controls
146 lines (128 loc) · 3.47 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
139
140
141
142
143
144
145
146
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"github.com/machinebox/graphql"
)
type ResponseStruct interface{}
type stringListFlags []string
func (i *stringListFlags) String() string {
return "StringList flags"
}
func (i *stringListFlags) Set(value string) error {
*i = append(*i, value)
return nil
}
var (
url string = "https://countries.trevorblades.com/"
query string = `query ($code:String!="US"){countries(filter:{code:{eq:$code}}){ capital name continent {name}}}`
queryfile string
headers stringListFlags
variables stringListFlags
filevariables stringListFlags
debug bool
)
func init() {
if v := os.Getenv("GRAPHQL_QUERYFILE"); v != "" {
log.Printf("Setting queryfile from env")
queryfile = v
}
if v := os.Getenv("GRAPHQL_QUERY"); v != "" {
log.Printf("Setting query from env")
query = v
}
if v := os.Getenv("GRAPHQL_URL"); v != "" {
log.Printf("Setting URL from env")
url = v
}
flag.StringVar(&url, "url", url, "Graphql server URL (or GRAPHQL_URL from env)")
flag.StringVar(&query, "query", query, "Graphql query (or GRAPHQL_QUERY from env)")
flag.StringVar(&queryfile, "queryfile", queryfile, "File containing graphql query (or GRAPHQL_QUERYFILE from env)")
flag.Var(&headers, "header", "HTTP Header (key: value)")
flag.Var(&variables, "var", "GraphQL variable (key=value)")
flag.Var(&filevariables, "filevar", "GraphQL variable read from file (key=filename)")
flag.BoolVar(&debug, "debug", debug, "Debugging")
flag.Parse()
if queryfile != "" {
if debug {
log.Printf("Reading query from file %s\n", queryfile)
}
if buf, err := ioutil.ReadFile(queryfile); err != nil {
log.Fatalf("Cannot open file %s: %s\n", queryfile, err.Error())
} else {
query = string(buf)
}
}
}
func main() {
if debug {
log.Printf("URL: %s\nQuery: %s\n", url, query)
}
client := graphql.NewClient(url)
req := graphql.NewRequest(query)
for k, v := range variables {
s := strings.Split(v, "=")
if len(s) > 1 {
key := s[0]
value := strings.Join(s[1:], "=")
if debug {
log.Printf("[%d] Setting variable %s to %s\n", k, key, value)
}
req.Var(key, value)
} else {
log.Printf("WARN: bad variable string %s, needs key=value\n", v)
}
}
for k, v := range filevariables {
s := strings.Split(v, "=")
if len(s) > 1 {
key := s[0]
value := strings.Join(s[1:], "=")
if debug {
log.Printf("[%d] Reading variable %s from file %s\n", k, key, value)
}
if b, err := ioutil.ReadFile(value); err != nil {
log.Fatalf("Cannot read variable from file %s: %s", value, err.Error())
} else {
var x interface{}
json.Unmarshal(b, &x)
req.Var(key, x)
if debug {
log.Printf("[%d] Setting variable %s to %s\n", k, key, string(b))
}
req.Var(key, x)
}
} else {
log.Printf("WARN: bad variable string %s, needs key=filename\n", v)
}
}
for k, v := range headers {
s := strings.Split(v, ":")
if len(s) > 1 {
key := s[0]
value := strings.Join(s[1:], ":")
if debug {
log.Printf("[%d] Setting header %s to %s\n", k, key, value)
}
req.Header.Set(key, value)
} else {
log.Printf("WARN: bad header string %s, needs key: value\n", v)
}
}
ctx := context.Background()
var respData ResponseStruct
if err := client.Run(ctx, req, &respData); err != nil {
log.Fatal(err)
}
if resp, err := json.MarshalIndent(respData, "", " "); err != nil {
log.Fatal(err)
} else {
fmt.Printf("%s\n", string(resp))
}
}