Skip to content

Commit aa8d53e

Browse files
authored
feat: use cobra for the CLI (#83)
Signed-off-by: Charles-Edouard Brétéché <[email protected]>
1 parent 7894539 commit aa8d53e

File tree

3 files changed

+44
-31
lines changed

3 files changed

+44
-31
lines changed

cmd/jpgo/main.go

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,78 +18,80 @@ package main
1818

1919
import (
2020
"encoding/json"
21-
"flag"
21+
"errors"
2222
"fmt"
2323
"io"
2424
"os"
2525

2626
"github.com/jmespath-community/go-jmespath/pkg/api"
2727
"github.com/jmespath-community/go-jmespath/pkg/parsing"
28+
"github.com/spf13/cobra"
2829
)
2930

30-
func errMsg(msg string, a ...interface{}) int {
31-
fmt.Fprintf(os.Stderr, msg, a...)
32-
fmt.Fprintln(os.Stderr)
33-
return 1
31+
func main() {
32+
var command command
33+
cmd := &cobra.Command{
34+
Use: "jpgo",
35+
Args: cobra.ExactArgs(1),
36+
RunE: command.run,
37+
}
38+
cmd.Flags().BoolVar(&command.astOnly, "ast", false, "Print the AST for the input expression and exit.")
39+
cmd.Flags().StringVar(&command.inputFile, "input", "", "Filename containing JSON data to search. If not provided, data is read from stdin.")
40+
if err := cmd.Execute(); err != nil {
41+
fmt.Fprintln(os.Stderr, err)
42+
os.Exit(1)
43+
}
3444
}
3545

36-
func run() int {
37-
astOnly := flag.Bool("ast", false, "Print the AST for the input expression and exit.")
38-
inputFile := flag.String("input", "", "Filename containing JSON data to search. If not provided, data is read from stdin.")
46+
type command struct {
47+
astOnly bool
48+
inputFile string
49+
}
3950

40-
flag.Parse()
41-
args := flag.Args()
51+
func (c command) run(cmd *cobra.Command, args []string) error {
4252
if len(args) != 1 {
43-
fmt.Fprintf(os.Stderr, "Usage:\n\n")
44-
flag.PrintDefaults()
45-
return errMsg("\nError: expected a single argument (the JMESPath expression).")
53+
return errors.New("error: expected a single argument (the JMESPath expression)")
4654
}
47-
4855
expression := args[0]
4956
parser := parsing.NewParser()
5057
parsed, err := parser.Parse(expression)
5158
if err != nil {
5259
if syntaxError, ok := err.(parsing.SyntaxError); ok {
53-
return errMsg("%s\n%s\n", syntaxError, syntaxError.HighlightLocation())
60+
return fmt.Errorf("%s\n%s", syntaxError, syntaxError.HighlightLocation())
5461
}
55-
return errMsg("%s", err)
62+
return err
5663
}
57-
if *astOnly {
64+
if c.astOnly {
5865
fmt.Println("")
5966
fmt.Printf("%s\n", parsed)
60-
return 0
67+
return nil
6168
}
62-
6369
var inputData []byte
64-
if *inputFile != "" {
65-
inputData, err = os.ReadFile(*inputFile)
70+
if c.inputFile != "" {
71+
inputData, err = os.ReadFile(c.inputFile)
6672
if err != nil {
67-
return errMsg("Error loading file %s: %s", *inputFile, err)
73+
return fmt.Errorf("error loading file %s: %w", c.inputFile, err)
6874
}
6975
} else {
7076
// If an input data file is not provided then we read the
7177
// data from stdin.
7278
inputData, err = io.ReadAll(os.Stdin)
7379
if err != nil {
74-
return errMsg("Error reading from stdin: %s", err)
80+
return fmt.Errorf("error reading from stdin: %w", err)
7581
}
7682
}
7783
var data interface{}
7884
if err := json.Unmarshal(inputData, &data); err != nil {
79-
return errMsg("Invalid input JSON: %s", err)
85+
return fmt.Errorf("invalid input JSON: %w", err)
8086
}
8187
result, err := api.Search(expression, data)
8288
if err != nil {
83-
return errMsg("Error executing expression: %s", err)
89+
return fmt.Errorf("error executing expression: %w", err)
8490
}
8591
toJSON, err := json.MarshalIndent(result, "", " ")
8692
if err != nil {
87-
return errMsg("Error serializing result to JSON: %s", err)
93+
return fmt.Errorf("error serializing result to JSON: %w", err)
8894
}
8995
fmt.Println(string(toJSON))
90-
return 0
91-
}
92-
93-
func main() {
94-
os.Exit(run())
96+
return nil
9597
}

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ module github.com/jmespath-community/go-jmespath
33
go 1.18
44

55
require (
6+
github.com/spf13/cobra v1.7.0
67
github.com/stretchr/testify v1.8.4
78
golang.org/x/exp v0.0.0-20230314191032-db074128a8ec
89
)
910

1011
require (
1112
github.com/davecgh/go-spew v1.1.1 // indirect
13+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
1214
github.com/pmezard/go-difflib v1.0.0 // indirect
15+
github.com/spf13/pflag v1.0.5 // indirect
1316
gopkg.in/yaml.v3 v3.0.1 // indirect
1417
)

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
12
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
23
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
5+
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
36
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
47
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8+
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
9+
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
10+
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
11+
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
12+
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
513
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
614
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
715
golang.org/x/exp v0.0.0-20230314191032-db074128a8ec h1:pAv+d8BM2JNnNctsLJ6nnZ6NqXT8N4+eauvZSb3P0I0=

0 commit comments

Comments
 (0)