1
0
mirror of https://github.com/TomWright/dasel.git synced 2022-05-22 02:32:45 +03:00
Files
dasel-data-selector/internal/command/put_object_internal.go
Tom Wright d140860fea Add multi value selector. (#34)
Select/Put multiple values in one query
2020-11-08 23:36:47 +00:00

117 lines
2.9 KiB
Go

package command
import (
"fmt"
"github.com/spf13/cobra"
"github.com/tomwright/dasel/internal/oflag"
"io"
"strings"
)
type putObjectOpts struct {
File string
Out string
Parser string
Selector string
InputTypes []string
InputValues []string
Reader io.Reader
Writer io.Writer
Multi bool
}
func getMapFromTypesValues(inputTypes []string, inputValues []string) (map[string]interface{}, error) {
if len(inputTypes) != len(inputValues) {
return nil, fmt.Errorf("exactly %d types are required, got %d", len(inputValues), len(inputTypes))
}
updateValue := map[string]interface{}{}
for k, arg := range inputValues {
splitArg := strings.Split(arg, "=")
name := splitArg[0]
value := strings.Join(splitArg[1:], "=")
parsedValue, err := parseValue(value, inputTypes[k])
if err != nil {
return nil, fmt.Errorf("could not parse value [%s]: %w", name, err)
}
updateValue[name] = parsedValue
}
return updateValue, nil
}
func runPutObjectCommand(opts putObjectOpts, cmd *cobra.Command) error {
parser, err := getParser(opts.File, opts.Parser)
if err != nil {
return err
}
rootNode, err := getRootNode(getRootNodeOpts{
File: opts.File,
Parser: parser,
Reader: opts.Reader,
}, cmd)
if err != nil {
return err
}
updateValue, err := getMapFromTypesValues(opts.InputTypes, opts.InputValues)
if err != nil {
return err
}
if opts.Multi {
if err := rootNode.PutMultiple(opts.Selector, updateValue); err != nil {
return fmt.Errorf("could not put object multi value: %w", err)
}
} else {
if err := rootNode.Put(opts.Selector, updateValue); err != nil {
return fmt.Errorf("could not put object value: %w", err)
}
}
if err := writeNodeToOutput(writeNodeToOutputOpts{
Node: rootNode,
Parser: parser,
File: opts.File,
Out: opts.Out,
Writer: opts.Writer,
}, cmd); err != nil {
return fmt.Errorf("could not write output: %w", err)
}
return nil
}
func putObjectCommand() *cobra.Command {
typeList := oflag.NewStringList()
cmd := &cobra.Command{
Use: "object -f <file> -s <selector> <value>",
Short: "Update a string property in the given file.",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
opts := putObjectOpts{
File: cmd.Flag("file").Value.String(),
Out: cmd.Flag("out").Value.String(),
Parser: cmd.Flag("parser").Value.String(),
Selector: cmd.Flag("selector").Value.String(),
InputTypes: typeList.Strings,
InputValues: args,
}
opts.Multi, _ = cmd.Flags().GetBool("multiple")
if opts.Selector == "" && len(opts.InputValues) > 0 {
opts.Selector = opts.InputValues[0]
opts.InputValues = opts.InputValues[1:]
}
return runPutObjectCommand(opts, cmd)
},
}
cmd.Flags().VarP(typeList, "type", "t", "Types of the variables in the object.")
_ = cmd.MarkFlagRequired("type")
return cmd
}