mirror of
https://github.com/mikefarah/yq.git
synced 2026-07-10 16:55:40 +00:00
Allow build without json and xml support
This commit is contained in:
parent
ad456c1846
commit
a82e10e439
@ -62,6 +62,9 @@ func configureDecoder(evaluateTogether bool) (yqlib.Decoder, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
yqlibDecoder, err := createDecoder(yqlibInputFormat, evaluateTogether)
|
yqlibDecoder, err := createDecoder(yqlibInputFormat, evaluateTogether)
|
||||||
|
if yqlibDecoder == nil {
|
||||||
|
return nil, fmt.Errorf("no support for %s input format", inputFormat)
|
||||||
|
}
|
||||||
return yqlibDecoder, err
|
return yqlibDecoder, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +111,9 @@ func configureEncoder() (yqlib.Encoder, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
yqlibEncoder, err := createEncoder(yqlibOutputFormat)
|
yqlibEncoder, err := createEncoder(yqlibOutputFormat)
|
||||||
|
if yqlibEncoder == nil {
|
||||||
|
return nil, fmt.Errorf("no support for %s output format", outputFormat)
|
||||||
|
}
|
||||||
return yqlibEncoder, err
|
return yqlibEncoder, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_nojson
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_noxml
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_nojson
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_nojson
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_noxml
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_nojson
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
11
pkg/yqlib/no_json.go
Normal file
11
pkg/yqlib/no_json.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//go:build yq_nojson
|
||||||
|
|
||||||
|
package yqlib
|
||||||
|
|
||||||
|
func NewJSONDecoder() Decoder {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewJSONEncoder(indent int, colorise bool, unwrapScalar bool) Encoder {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
11
pkg/yqlib/no_xml.go
Normal file
11
pkg/yqlib/no_xml.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//go:build yq_noxml
|
||||||
|
|
||||||
|
package yqlib
|
||||||
|
|
||||||
|
func NewXMLDecoder(prefs XmlPreferences) Decoder {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewXMLEncoder(indent int, prefs XmlPreferences) Encoder {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"container/list"
|
"container/list"
|
||||||
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -39,6 +40,9 @@ func encodeToString(candidate *CandidateNode, prefs encoderPreferences) (string,
|
|||||||
log.Debug("printing with indent: %v", prefs.indent)
|
log.Debug("printing with indent: %v", prefs.indent)
|
||||||
|
|
||||||
encoder := configureEncoder(prefs.format, prefs.indent)
|
encoder := configureEncoder(prefs.format, prefs.indent)
|
||||||
|
if encoder == nil {
|
||||||
|
return "", errors.New("no support for output format")
|
||||||
|
}
|
||||||
|
|
||||||
printer := NewPrinter(encoder, NewSinglePrinterWriter(bufio.NewWriter(&output)))
|
printer := NewPrinter(encoder, NewSinglePrinterWriter(bufio.NewWriter(&output)))
|
||||||
err := printer.PrintResults(candidate.AsList())
|
err := printer.PrintResults(candidate.AsList())
|
||||||
@ -127,6 +131,9 @@ func decodeOperator(d *dataTreeNavigator, context Context, expressionNode *Expre
|
|||||||
preferences := expressionNode.Operation.Preferences.(decoderPreferences)
|
preferences := expressionNode.Operation.Preferences.(decoderPreferences)
|
||||||
|
|
||||||
decoder := createDecoder(preferences.format)
|
decoder := createDecoder(preferences.format)
|
||||||
|
if decoder == nil {
|
||||||
|
return Context{}, errors.New("no support for input format")
|
||||||
|
}
|
||||||
|
|
||||||
var results = list.New()
|
var results = list.New()
|
||||||
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
|
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
|
||||||
|
|||||||
@ -8,6 +8,7 @@ var prefix = "D0, P[], (doc)::a:\n cool:\n bob: dylan\n"
|
|||||||
|
|
||||||
var encoderDecoderOperatorScenarios = []expressionScenario{
|
var encoderDecoderOperatorScenarios = []expressionScenario{
|
||||||
{
|
{
|
||||||
|
requiresFormat: "json",
|
||||||
description: "Encode value as json string",
|
description: "Encode value as json string",
|
||||||
document: `{a: {cool: "thing"}}`,
|
document: `{a: {cool: "thing"}}`,
|
||||||
expression: `.b = (.a | to_json)`,
|
expression: `.b = (.a | to_json)`,
|
||||||
@ -17,6 +18,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "json",
|
||||||
description: "Encode value as json string, on one line",
|
description: "Encode value as json string, on one line",
|
||||||
subdescription: "Pass in a 0 indent to print json on a single line.",
|
subdescription: "Pass in a 0 indent to print json on a single line.",
|
||||||
document: `{a: {cool: "thing"}}`,
|
document: `{a: {cool: "thing"}}`,
|
||||||
@ -27,6 +29,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "json",
|
||||||
description: "Encode value as json string, on one line shorthand",
|
description: "Encode value as json string, on one line shorthand",
|
||||||
subdescription: "Pass in a 0 indent to print json on a single line.",
|
subdescription: "Pass in a 0 indent to print json on a single line.",
|
||||||
document: `{a: {cool: "thing"}}`,
|
document: `{a: {cool: "thing"}}`,
|
||||||
@ -37,6 +40,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "json",
|
||||||
description: "Decode a json encoded string",
|
description: "Decode a json encoded string",
|
||||||
subdescription: "Keep in mind JSON is a subset of YAML. If you want idiomatic yaml, pipe through the style operator to clear out the JSON styling.",
|
subdescription: "Keep in mind JSON is a subset of YAML. If you want idiomatic yaml, pipe through the style operator to clear out the JSON styling.",
|
||||||
document: `a: '{"cool":"thing"}'`,
|
document: `a: '{"cool":"thing"}'`,
|
||||||
@ -193,6 +197,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "Encode value as xml string",
|
description: "Encode value as xml string",
|
||||||
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
||||||
expression: `.a | to_xml`,
|
expression: `.a | to_xml`,
|
||||||
@ -201,6 +206,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "Encode value as xml string on a single line",
|
description: "Encode value as xml string on a single line",
|
||||||
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
||||||
expression: `.a | @xml`,
|
expression: `.a | @xml`,
|
||||||
@ -209,6 +215,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "Encode value as xml string with custom indentation",
|
description: "Encode value as xml string with custom indentation",
|
||||||
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
document: `{a: {cool: {foo: "bar", +@id: hi}}}`,
|
||||||
expression: `{"cat": .a | to_xml(1)}`,
|
expression: `{"cat": .a | to_xml(1)}`,
|
||||||
@ -217,6 +224,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "Decode a xml encoded string",
|
description: "Decode a xml encoded string",
|
||||||
document: `a: "<foo>bar</foo>"`,
|
document: `a: "<foo>bar</foo>"`,
|
||||||
expression: `.b = (.a | from_xml)`,
|
expression: `.b = (.a | from_xml)`,
|
||||||
@ -303,6 +311,7 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "empty xml decode",
|
description: "empty xml decode",
|
||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
expression: `"" | @xmld`,
|
expression: `"" | @xmld`,
|
||||||
|
|||||||
@ -34,6 +34,9 @@ func loadString(filename string) (*CandidateNode, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func loadYaml(filename string, decoder Decoder) (*CandidateNode, error) {
|
func loadYaml(filename string, decoder Decoder) (*CandidateNode, error) {
|
||||||
|
if decoder == nil {
|
||||||
|
return nil, fmt.Errorf("could not load %s", filename)
|
||||||
|
}
|
||||||
|
|
||||||
file, err := os.Open(filename) // #nosec
|
file, err := os.Open(filename) // #nosec
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -74,6 +74,7 @@ var loadScenarios = []expressionScenario{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
requiresFormat: "xml",
|
||||||
description: "Load from XML",
|
description: "Load from XML",
|
||||||
document: "cool: things",
|
document: "cool: things",
|
||||||
expression: `.more_stuff = load_xml("../../examples/small.xml")`,
|
expression: `.more_stuff = load_xml("../../examples/small.xml")`,
|
||||||
|
|||||||
@ -28,6 +28,7 @@ type expressionScenario struct {
|
|||||||
skipDoc bool
|
skipDoc bool
|
||||||
expectedError string
|
expectedError string
|
||||||
dontFormatInputForDoc bool // dont format input doc for documentation generation
|
dontFormatInputForDoc bool // dont format input doc for documentation generation
|
||||||
|
requiresFormat string
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
@ -103,6 +104,23 @@ func testScenario(t *testing.T, s *expressionScenario) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.requiresFormat != "" {
|
||||||
|
format := s.requiresFormat
|
||||||
|
inputFormat, err := InputFormatFromString(format)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if decoder := createDecoder(inputFormat); decoder == nil {
|
||||||
|
t.Skipf("no support for %s input format", format)
|
||||||
|
}
|
||||||
|
outputFormat, err := OutputFormatFromString(format)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if encoder := configureEncoder(outputFormat, 4); encoder == nil {
|
||||||
|
t.Skipf("no support for %s output format", format)
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(fmt.Errorf("%w: %v: %v", err, s.description, s.expression))
|
t.Error(fmt.Errorf("%w: %v: %v", err, s.description, s.expression))
|
||||||
return
|
return
|
||||||
|
|||||||
@ -315,6 +315,9 @@ func TestPrinterMultipleDocsJson(t *testing.T) {
|
|||||||
// note printDocSeparators is true, it should still not print document separators
|
// note printDocSeparators is true, it should still not print document separators
|
||||||
// when outputing JSON.
|
// when outputing JSON.
|
||||||
encoder := NewJSONEncoder(0, false, false)
|
encoder := NewJSONEncoder(0, false, false)
|
||||||
|
if encoder == nil {
|
||||||
|
t.Skipf("no support for %s output format", "json")
|
||||||
|
}
|
||||||
printer := NewPrinter(encoder, NewSinglePrinterWriter(writer))
|
printer := NewPrinter(encoder, NewSinglePrinterWriter(writer))
|
||||||
|
|
||||||
inputs, err := readDocuments(strings.NewReader(multiDocSample), "sample.yml", 0, NewYamlDecoder(ConfiguredYamlPreferences))
|
inputs, err := readDocuments(strings.NewReader(multiDocSample), "sample.yml", 0, NewYamlDecoder(ConfiguredYamlPreferences))
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !yq_noxml
|
||||||
|
|
||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user