diff --git a/internal/command/delete.go b/internal/command/delete.go index 6ed10435..06833fbe 100644 --- a/internal/command/delete.go +++ b/internal/command/delete.go @@ -27,6 +27,7 @@ func deleteFlags(cmd *cobra.Command) { 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().Int("indent", 2, "The indention level when writing files.") 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.") @@ -44,6 +45,7 @@ func deleteRunE(cmd *cobra.Command, args []string) error { colourFlag, _ := cmd.Flags().GetBool("colour") escapeHTMLFlag, _ := cmd.Flags().GetBool("escape-html") outFlag, _ := cmd.Flags().GetString("out") + indent, _ := cmd.Flags().GetInt("indent") csvComma, _ := cmd.Flags().GetString("csv-comma") csvWriteComma, _ := cmd.Flags().GetString("csv-write-comma") csvComment, _ := cmd.Flags().GetString("csv-comment") @@ -64,6 +66,7 @@ func deleteRunE(cmd *cobra.Command, args []string) error { PrettyPrint: prettyPrintFlag, Colourise: colourFlag, EscapeHTML: escapeHTMLFlag, + Indent: indent, CsvComma: csvWriteComma, CsvUseCRLF: csvCRLF, }, diff --git a/internal/command/delete_test.go b/internal/command/delete_test.go index 2aaa2bcc..f06aa55f 100644 --- a/internal/command/delete_test.go +++ b/internal/command/delete_test.go @@ -37,4 +37,28 @@ func TestDeleteCommand(t *testing.T) { nil, nil, )) + + t.Run("CheckIndentionForJSON", runTest( + []string{"delete", "-r", "json", "--indent", "6", "--pretty=true", "x.y"}, + []byte(`{"x":{"x":1,"y":2}}`), + newline([]byte("{\n \"x\": {\n \"x\": 1\n }\n}")), + nil, + nil, + )) + + t.Run("CheckIndentionForYAML", runTest( + []string{"delete", "-r", "json", "-w", "yaml", "--indent", "6", "--pretty=true", "x.y"}, + []byte(`{"x":{"x":1,"y":2}}`), + newline([]byte("x:\n x: 1")), + nil, + nil, + )) + + t.Run("CheckIndentionForTOML", runTest( + []string{"delete", "-r", "json", "-w", "toml", "--indent", "6", "--pretty=true", "x.y"}, + []byte(`{"x":{"x":1,"y":2}}`), + newline([]byte("[x]\n x = 1")), + nil, + nil, + )) } diff --git a/internal/command/options.go b/internal/command/options.go index 39651502..3008ccd7 100644 --- a/internal/command/options.go +++ b/internal/command/options.go @@ -8,6 +8,7 @@ import ( "github.com/tomwright/dasel/v2/storage" "io" "os" + "strings" ) type readOptions struct { @@ -108,6 +109,8 @@ type writeOptions struct { CsvComma string // CsvUseCRLF determines whether CRLF is used when writing CSV files. CsvUseCRLF bool + + Indent int } func (o *writeOptions) writeToStdout() bool { @@ -163,6 +166,10 @@ func (o *writeOptions) writeValues(cmd *cobra.Command, readOptions *readOptions, options = append(options, storage.CsvCommaOption([]rune(o.CsvComma)[0])) } + if o.Indent != 0 { + options = append(options, storage.IndentOption(strings.Repeat(" ", o.Indent))) + } + writer := o.Writer if writer == nil { if o.writeToStdout() { diff --git a/internal/command/put.go b/internal/command/put.go index 05e5e092..6ec1b7a2 100644 --- a/internal/command/put.go +++ b/internal/command/put.go @@ -32,6 +32,7 @@ func putFlags(cmd *cobra.Command) { 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().Int("indent", 2, "The indention level when writing files.") 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.") @@ -51,6 +52,7 @@ func putRunE(cmd *cobra.Command, args []string) error { colourFlag, _ := cmd.Flags().GetBool("colour") escapeHTMLFlag, _ := cmd.Flags().GetBool("escape-html") outFlag, _ := cmd.Flags().GetString("out") + indent, _ := cmd.Flags().GetInt("indent") csvComma, _ := cmd.Flags().GetString("csv-comma") csvWriteComma, _ := cmd.Flags().GetString("csv-write-comma") csvComment, _ := cmd.Flags().GetString("csv-comment") @@ -71,6 +73,7 @@ func putRunE(cmd *cobra.Command, args []string) error { PrettyPrint: prettyPrintFlag, Colourise: colourFlag, EscapeHTML: escapeHTMLFlag, + Indent: indent, CsvComma: csvWriteComma, CsvUseCRLF: csvCRLF, }, diff --git a/internal/command/put_test.go b/internal/command/put_test.go index c2fb3856..13545381 100644 --- a/internal/command/put_test.go +++ b/internal/command/put_test.go @@ -200,4 +200,28 @@ func TestPutCommand(t *testing.T) { nil, nil, )) + + t.Run("VerifyCorrectIndentionForJSON", runTest( + []string{"put", "-r", "json", "--indent", "6", "-t", "string", "--pretty=true", "-v", "Tom", "user"}, + []byte(`{}`), + newline([]byte("{\n \"user\": \"Tom\"\n}")), + nil, + nil, + )) + + t.Run("VerifyCorrectIndentionForYAML", runTest( + []string{"put", "-r", "yaml", "--indent", "6", "-t", "string", "-v", "Tom", "user.name"}, + []byte(``), + newline([]byte("user:\n name: Tom")), + nil, + nil, + )) + + t.Run("VerifyCorrectIndentionForTOML", runTest( + []string{"put", "-r", "toml", "--indent", "6", "-t", "string", "-v", "Tom", "user.name"}, + []byte(``), + newline([]byte("[user]\n name = 'Tom'")), + nil, + nil, + )) } diff --git a/internal/command/select.go b/internal/command/select.go index f0d853ce..0e6816b9 100644 --- a/internal/command/select.go +++ b/internal/command/select.go @@ -26,6 +26,7 @@ func selectFlags(cmd *cobra.Command) { 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().Int("indent", 2, "The indention level when writing files.") 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.") @@ -42,6 +43,7 @@ func selectRunE(cmd *cobra.Command, args []string) error { prettyPrintFlag, _ := cmd.Flags().GetBool("pretty") colourFlag, _ := cmd.Flags().GetBool("colour") escapeHTMLFlag, _ := cmd.Flags().GetBool("escape-html") + indent, _ := cmd.Flags().GetInt("indent") csvComma, _ := cmd.Flags().GetString("csv-comma") csvWriteComma, _ := cmd.Flags().GetString("csv-write-comma") csvComment, _ := cmd.Flags().GetString("csv-comment") @@ -62,6 +64,7 @@ func selectRunE(cmd *cobra.Command, args []string) error { PrettyPrint: prettyPrintFlag, Colourise: colourFlag, EscapeHTML: escapeHTMLFlag, + Indent: indent, CsvComma: csvWriteComma, CsvUseCRLF: csvCRLF, }, diff --git a/internal/command/select_test.go b/internal/command/select_test.go index cf3ef9d5..c9fccc02 100644 --- a/internal/command/select_test.go +++ b/internal/command/select_test.go @@ -89,6 +89,30 @@ func TestSelectCommand(t *testing.T) { nil, )) + t.Run("VerifyCorrectIndentionForJSON", runTest( + []string{"-r", "json", "--indent", "6", "--pretty=true", "users.all().filter(equal(flags.isBanned,true)).name"}, + standardJsonSelectTestData(), + newline([]byte("{\n \"first\": \"Jim\",\n \"last\": \"Wright\"\n}")), + nil, + nil, + )) + + t.Run("VerifyCorrectIndentionForYAML", runTest( + []string{"-r", "json", "-w", "yaml", "--indent", "6", "--pretty=true", "users.all().filter(equal(flags.isBanned,true))"}, + standardJsonSelectTestData(), + newline([]byte("name:\n first: Jim\n last: Wright\nflags:\n isBanned: true")), + nil, + nil, + )) + + t.Run("VerifyCorrectIndentionForTOML", runTest( + []string{"-r", "json", "-w", "toml", "--indent", "6", "--pretty=true", "users.all().filter(equal(flags.isBanned,true))"}, + standardJsonSelectTestData(), + newline([]byte("[flags]\n isBanned = true\n\n[name]\n first = 'Jim'\n last = 'Wright'")), + nil, + nil, + )) + t.Run("Issue258", runTest( []string{"-r", "json", "--pretty=false", "-w", "csv", "phones.all().mapOf(make,make,model,model,first,parent().parent().user.name.first,last,parent().parent().user.name.last).merge()"}, []byte(`{ diff --git a/storage/yaml.go b/storage/yaml.go index 1b049b4f..0c8c9bc2 100644 --- a/storage/yaml.go +++ b/storage/yaml.go @@ -92,8 +92,8 @@ func (p *YAMLParser) ToBytes(value dasel.Value, options ...ReadWriteOption) ([]b colourise = value } case OptionIndent: - if value, ok := o.Value.(int); ok { - encoderOptions = append(encoderOptions, dencoding.YAMLEncodeIndent(value)) + if value, ok := o.Value.(string); ok { + encoderOptions = append(encoderOptions, dencoding.YAMLEncodeIndent(len(value))) } } }