yq/pkg/yqlib/encoder_json.go

67 lines
1.3 KiB
Go
Raw Normal View History

//go:build !yq_nojson
package yqlib
import (
2022-05-22 11:19:59 +00:00
"bytes"
"io"
2022-07-27 02:26:22 +00:00
"github.com/goccy/go-json"
)
type jsonEncoder struct {
indentString string
2022-05-22 11:19:59 +00:00
colorise bool
UnwrapScalar bool
}
func NewJSONEncoder(indent int, colorise bool, unwrapScalar bool) Encoder {
var indentString = ""
for index := 0; index < indent; index++ {
indentString = indentString + " "
}
return &jsonEncoder{indentString, colorise, unwrapScalar}
}
func (je *jsonEncoder) CanHandleAliases() bool {
return false
}
func (je *jsonEncoder) PrintDocumentSeparator(writer io.Writer) error {
return nil
}
func (je *jsonEncoder) PrintLeadingContent(writer io.Writer, content string) error {
return nil
}
2023-04-08 09:56:35 +00:00
func (je *jsonEncoder) Encode(writer io.Writer, node *CandidateNode) error {
2023-04-12 09:04:02 +00:00
log.Debugf("I need to encode %v", NodeToString(node))
log.Debugf("kids %v", len(node.Content))
2022-05-22 11:19:59 +00:00
2023-04-08 09:56:35 +00:00
if node.Kind == ScalarNode && je.UnwrapScalar {
return writeString(writer, node.Value+"\n")
}
2022-05-22 11:19:59 +00:00
destination := writer
tempBuffer := bytes.NewBuffer(nil)
if je.colorise {
destination = tempBuffer
}
var encoder = json.NewEncoder(destination)
encoder.SetEscapeHTML(false) // do not escape html chars e.g. &, <, >
encoder.SetIndent("", je.indentString)
2023-04-12 09:04:02 +00:00
err := encoder.Encode(node)
2022-05-22 11:19:59 +00:00
if err != nil {
return err
}
if je.colorise {
return colorizeAndPrint(tempBuffer.Bytes(), writer)
}
return nil
}