-
-
Notifications
You must be signed in to change notification settings - Fork 116
/
select.go
113 lines (95 loc) · 3.21 KB
/
select.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
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
package command
import (
"github.com/spf13/cobra"
"github.com/tomwright/dasel/v2"
)
func selectCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "dasel -f <file> -r <json,yaml,toml,xml,csv> <selector>",
Short: "Select properties from the given file.",
RunE: selectRunE,
Args: cobra.MaximumNArgs(1),
}
selectFlags(cmd)
return cmd
}
func selectFlags(cmd *cobra.Command) {
cmd.Flags().StringP("selector", "s", "", "The selector to use when querying the data structure.")
cmd.Flags().StringP("read", "r", "", "The parser to use when reading.")
cmd.Flags().StringP("file", "f", "", "The file to query.")
cmd.Flags().StringP("write", "w", "", "The parser to use when writing. Defaults to the read parser if not provided.")
cmd.Flags().Bool("pretty", true, "Pretty print the output.")
cmd.Flags().Bool("colour", false, "Print colourised output.")
cmd.Flags().Bool("escape-html", false, "Escape HTML tags when writing output.")
cmd.Flags().String("csv-comma", ",", "Comma separator to use when working with csv files.")
cmd.Flags().String("csv-write-comma", "", "Comma separator used when writing csv files. Overrides csv-comma when writing.")
cmd.Flags().String("csv-comment", "", "Comma separator used when reading csv files.")
cmd.Flags().Bool("csv-crlf", false, "True to use CRLF when writing CSV files.")
_ = cmd.MarkFlagFilename("file")
}
func selectRunE(cmd *cobra.Command, args []string) error {
selectorFlag, _ := cmd.Flags().GetString("selector")
readParserFlag, _ := cmd.Flags().GetString("read")
fileFlag, _ := cmd.Flags().GetString("file")
writeParserFlag, _ := cmd.Flags().GetString("write")
prettyPrintFlag, _ := cmd.Flags().GetBool("pretty")
colourFlag, _ := cmd.Flags().GetBool("colour")
escapeHTMLFlag, _ := cmd.Flags().GetBool("escape-html")
csvComma, _ := cmd.Flags().GetString("csv-comma")
csvWriteComma, _ := cmd.Flags().GetString("csv-write-comma")
csvComment, _ := cmd.Flags().GetString("csv-comment")
csvCRLF, _ := cmd.Flags().GetBool("csv-crlf")
opts := &selectOptions{
Read: &readOptions{
Reader: nil,
Parser: readParserFlag,
FilePath: fileFlag,
CsvComma: csvComma,
CsvComment: csvComment,
},
Write: &writeOptions{
Writer: nil,
Parser: writeParserFlag,
FilePath: "stdout",
PrettyPrint: prettyPrintFlag,
Colourise: colourFlag,
EscapeHTML: escapeHTMLFlag,
CsvComma: csvWriteComma,
CsvUseCRLF: csvCRLF,
},
Selector: selectorFlag,
}
if opts.Selector == "" && len(args) > 0 {
opts.Selector = args[0]
args = args[1:]
}
if opts.Selector == "" {
opts.Selector = "."
}
return runSelectCommand(opts, cmd)
}
type selectOptions struct {
Read *readOptions
Write *writeOptions
Selector string
}
func runSelectCommand(opts *selectOptions, cmd *cobra.Command) error {
rootValue, err := opts.Read.rootValue(cmd)
if err != nil {
return err
}
values, err := dasel.Select(rootValue, opts.Selector)
if err != nil {
return err
}
if err := opts.Write.writeValues(cmd, opts.Read, values); err != nil {
return err
}
return nil
// todo : check if this is still needed.
// if !rootNode.Value.IsValid() {
// rootNode = dasel.New(&storage.BasicSingleDocument{
// Value: map[string]interface{}{},
// })
// }
}