diff --git a/cmd/evaluate_all_command.go b/cmd/evaluate_all_command.go index 63b68871..fff64fa5 100644 --- a/cmd/evaluate_all_command.go +++ b/cmd/evaluate_all_command.go @@ -84,7 +84,10 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) { if err != nil { return err } - encoder := configureEncoder(format) + encoder, err := configureEncoder() + if err != nil { + return err + } printer := yqlib.NewPrinter(encoder, printerWriter) diff --git a/cmd/evalute_sequence_command.go b/cmd/evalute_sequence_command.go index 53108165..dab803c3 100644 --- a/cmd/evalute_sequence_command.go +++ b/cmd/evalute_sequence_command.go @@ -93,7 +93,10 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) { if err != nil { return err } - encoder := configureEncoder(format) + encoder, err := configureEncoder() + if err != nil { + return err + } printer := yqlib.NewPrinter(encoder, printerWriter) diff --git a/cmd/utils.go b/cmd/utils.go index 8dad7c30..3b5e79f7 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -61,7 +61,12 @@ func configureDecoder(evaluateTogether bool) (yqlib.Decoder, error) { if err != nil { return nil, err } - switch yqlibInputFormat { + yqlibDecoder, err := createDecoder(yqlibInputFormat, evaluateTogether) + return yqlibDecoder, err +} + +func createDecoder(format yqlib.InputFormat, evaluateTogether bool) (yqlib.Decoder, error) { + switch format { case yqlib.XMLInputFormat: return yqlib.NewXMLDecoder(yqlib.ConfiguredXMLPreferences), nil case yqlib.PropertiesInputFormat: @@ -72,10 +77,12 @@ func configureDecoder(evaluateTogether bool) (yqlib.Decoder, error) { return yqlib.NewCSVObjectDecoder(','), nil case yqlib.TSVObjectInputFormat: return yqlib.NewCSVObjectDecoder('\t'), nil + case yqlib.YamlInputFormat: + prefs := yqlib.ConfiguredYamlPreferences + prefs.EvaluateTogether = evaluateTogether + return yqlib.NewYamlDecoder(prefs), nil } - prefs := yqlib.ConfiguredYamlPreferences - prefs.EvaluateTogether = evaluateTogether - return yqlib.NewYamlDecoder(prefs), nil + return nil, fmt.Errorf("invalid decoder: %v", format) } func configurePrinterWriter(format yqlib.PrinterOutputFormat, out io.Writer) (yqlib.PrinterWriter, error) { @@ -95,22 +102,31 @@ func configurePrinterWriter(format yqlib.PrinterOutputFormat, out io.Writer) (yq return printerWriter, nil } -func configureEncoder(format yqlib.PrinterOutputFormat) yqlib.Encoder { +func configureEncoder() (yqlib.Encoder, error) { + yqlibOutputFormat, err := yqlib.OutputFormatFromString(outputFormat) + if err != nil { + return nil, err + } + yqlibEncoder, err := createEncoder(yqlibOutputFormat) + return yqlibEncoder, err +} + +func createEncoder(format yqlib.PrinterOutputFormat) (yqlib.Encoder, error) { switch format { case yqlib.JSONOutputFormat: - return yqlib.NewJSONEncoder(indent, colorsEnabled, unwrapScalar) + return yqlib.NewJSONEncoder(indent, colorsEnabled, unwrapScalar), nil case yqlib.PropsOutputFormat: - return yqlib.NewPropertiesEncoder(unwrapScalar) + return yqlib.NewPropertiesEncoder(unwrapScalar), nil case yqlib.CSVOutputFormat: - return yqlib.NewCsvEncoder(',') + return yqlib.NewCsvEncoder(','), nil case yqlib.TSVOutputFormat: - return yqlib.NewCsvEncoder('\t') + return yqlib.NewCsvEncoder('\t'), nil case yqlib.YamlOutputFormat: - return yqlib.NewYamlEncoder(indent, colorsEnabled, yqlib.ConfiguredYamlPreferences) + return yqlib.NewYamlEncoder(indent, colorsEnabled, yqlib.ConfiguredYamlPreferences), nil case yqlib.XMLOutputFormat: - return yqlib.NewXMLEncoder(indent, yqlib.ConfiguredXMLPreferences) + return yqlib.NewXMLEncoder(indent, yqlib.ConfiguredXMLPreferences), nil } - panic("invalid encoder") + return nil, fmt.Errorf("invalid encoder: %v", format) } // this is a hack to enable backwards compatibility with githubactions (which pipe /dev/null into everything) diff --git a/pkg/yqlib/operator_encoder_decoder.go b/pkg/yqlib/operator_encoder_decoder.go index 255b0664..718ab59b 100644 --- a/pkg/yqlib/operator_encoder_decoder.go +++ b/pkg/yqlib/operator_encoder_decoder.go @@ -98,13 +98,11 @@ type decoderPreferences struct { format InputFormat } -/* takes a string and decodes it back into an object */ -func decodeOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { - - preferences := expressionNode.Operation.Preferences.(decoderPreferences) - +func createDecoder(format InputFormat) Decoder { var decoder Decoder - switch preferences.format { + switch format { + case JsonInputFormat: + decoder = NewJSONDecoder() case YamlInputFormat: decoder = NewYamlDecoder(ConfiguredYamlPreferences) case XMLInputFormat: @@ -120,6 +118,15 @@ func decodeOperator(d *dataTreeNavigator, context Context, expressionNode *Expre case UriInputFormat: decoder = NewUriDecoder() } + return decoder +} + +/* takes a string and decodes it back into an object */ +func decodeOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { + + preferences := expressionNode.Operation.Preferences.(decoderPreferences) + + decoder := createDecoder(preferences.format) var results = list.New() for el := context.MatchingNodes.Front(); el != nil; el = el.Next() { diff --git a/pkg/yqlib/printer_test.go b/pkg/yqlib/printer_test.go index cc7b3dbe..b913daca 100644 --- a/pkg/yqlib/printer_test.go +++ b/pkg/yqlib/printer_test.go @@ -314,7 +314,8 @@ func TestPrinterMultipleDocsJson(t *testing.T) { var writer = bufio.NewWriter(&output) // note printDocSeparators is true, it should still not print document separators // when outputing JSON. - printer := NewPrinter(NewJSONEncoder(0, false, false), NewSinglePrinterWriter(writer)) + encoder := NewJSONEncoder(0, false, false) + printer := NewPrinter(encoder, NewSinglePrinterWriter(writer)) inputs, err := readDocuments(strings.NewReader(multiDocSample), "sample.yml", 0, NewYamlDecoder(ConfiguredYamlPreferences)) if err != nil {