@@ -18,78 +18,80 @@ package main
18
18
19
19
import (
20
20
"encoding/json"
21
- "flag "
21
+ "errors "
22
22
"fmt"
23
23
"io"
24
24
"os"
25
25
26
26
"github.com/jmespath-community/go-jmespath/pkg/api"
27
27
"github.com/jmespath-community/go-jmespath/pkg/parsing"
28
+ "github.com/spf13/cobra"
28
29
)
29
30
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
+ }
34
44
}
35
45
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
+ }
39
50
40
- flag .Parse ()
41
- args := flag .Args ()
51
+ func (c command ) run (cmd * cobra.Command , args []string ) error {
42
52
if len (args ) != 1 {
43
- fmt .Fprintf (os .Stderr , "Usage:\n \n " )
44
- flag .PrintDefaults ()
45
- return errMsg ("\n Error: expected a single argument (the JMESPath expression)." )
53
+ return errors .New ("error: expected a single argument (the JMESPath expression)" )
46
54
}
47
-
48
55
expression := args [0 ]
49
56
parser := parsing .NewParser ()
50
57
parsed , err := parser .Parse (expression )
51
58
if err != nil {
52
59
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 ())
54
61
}
55
- return errMsg ( "%s" , err )
62
+ return err
56
63
}
57
- if * astOnly {
64
+ if c . astOnly {
58
65
fmt .Println ("" )
59
66
fmt .Printf ("%s\n " , parsed )
60
- return 0
67
+ return nil
61
68
}
62
-
63
69
var inputData []byte
64
- if * inputFile != "" {
65
- inputData , err = os .ReadFile (* inputFile )
70
+ if c . inputFile != "" {
71
+ inputData , err = os .ReadFile (c . inputFile )
66
72
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 )
68
74
}
69
75
} else {
70
76
// If an input data file is not provided then we read the
71
77
// data from stdin.
72
78
inputData , err = io .ReadAll (os .Stdin )
73
79
if err != nil {
74
- return errMsg ( "Error reading from stdin: %s " , err )
80
+ return fmt . Errorf ( "error reading from stdin: %w " , err )
75
81
}
76
82
}
77
83
var data interface {}
78
84
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 )
80
86
}
81
87
result , err := api .Search (expression , data )
82
88
if err != nil {
83
- return errMsg ( "Error executing expression: %s " , err )
89
+ return fmt . Errorf ( "error executing expression: %w " , err )
84
90
}
85
91
toJSON , err := json .MarshalIndent (result , "" , " " )
86
92
if err != nil {
87
- return errMsg ( "Error serializing result to JSON: %s " , err )
93
+ return fmt . Errorf ( "error serializing result to JSON: %w " , err )
88
94
}
89
95
fmt .Println (string (toJSON ))
90
- return 0
91
- }
92
-
93
- func main () {
94
- os .Exit (run ())
96
+ return nil
95
97
}
0 commit comments