-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
executable file
·77 lines (62 loc) · 1.43 KB
/
main.go
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
package main
import (
"encoding/json"
"fmt"
"github.com/jessevdk/go-flags"
"net/url"
"os"
"text/template"
)
var options struct {
Format string `short:"f" long:"format" name:"output format" description:"format output with text/template syntax"`
NoNewline bool `short:"n" long:"no-newline" name:"no newline" description:"do not print new line symbol'"`
Args struct {
Input string `positional-arg-name:"input"`
} `positional-args:"true" required:"1"`
}
type urlObject struct {
*url.URL
Query url.Values `json:"Query"`
}
func logAndExit(err error) {
if _, pErr := fmt.Fprintln(os.Stderr, err); pErr != nil {
panic(pErr)
}
os.Exit(1)
}
func formatOutput(desired string) string {
if options.NoNewline {
return desired
}
return desired + "\n"
}
func main() {
parser := flags.NewParser(&options, flags.Default)
if _, err := parser.Parse(); err != nil {
os.Exit(1)
}
parsedURL, err := url.Parse(options.Args.Input)
if err != nil {
logAndExit(err)
}
output, err := json.Marshal(urlObject{
URL: parsedURL,
Query: parsedURL.Query(),
})
if err != nil {
logAndExit(err)
}
if options.Format != "" {
tpl, err := template.New("gurl").Parse(formatOutput(options.Format))
if err != nil {
logAndExit(err)
}
if err := tpl.Execute(os.Stdout, parsedURL); err != nil {
logAndExit(err)
}
return
}
if _, err := fmt.Fprint(os.Stdout, formatOutput(string(output))); err != nil {
logAndExit(err)
}
}