mirror of
https://github.com/wader/fq.git
synced 2024-12-23 13:22:58 +03:00
Feels less cluttered, easier to read and more consistent. Still keep tovalue, tobytes etc that are more basic functions this only renamed format related functions. Also there is an exceptin for to/fromjson as it comes from jq. Also fixes lots of spelling errors while reading thru.
70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
package yaml
|
|
|
|
// TODO: yaml type eval? walk eval?
|
|
|
|
import (
|
|
"embed"
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/wader/fq/format"
|
|
"github.com/wader/fq/internal/gojqex"
|
|
"github.com/wader/fq/pkg/bitio"
|
|
"github.com/wader/fq/pkg/decode"
|
|
"github.com/wader/fq/pkg/interp"
|
|
"github.com/wader/fq/pkg/scalar"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
//go:embed yaml.jq
|
|
var yamlFS embed.FS
|
|
|
|
func init() {
|
|
interp.RegisterFormat(decode.Format{
|
|
Name: format.YAML,
|
|
Description: "YAML Ain't Markup Language",
|
|
ProbeOrder: format.ProbeOrderTextFuzzy,
|
|
Groups: []string{format.PROBE},
|
|
DecodeFn: decodeYAML,
|
|
Functions: []string{"_todisplay"},
|
|
})
|
|
interp.RegisterFS(yamlFS)
|
|
interp.RegisterFunc0("to_yaml", toYAML)
|
|
}
|
|
|
|
func decodeYAML(d *decode.D, _ any) any {
|
|
br := d.RawLen(d.Len())
|
|
var r any
|
|
|
|
yd := yaml.NewDecoder(bitio.NewIOReader(br))
|
|
if err := yd.Decode(&r); err != nil {
|
|
d.Fatalf("%s", err)
|
|
}
|
|
if err := yd.Decode(new(any)); !errors.Is(err, io.EOF) {
|
|
d.Fatalf("trialing data after top-level value")
|
|
}
|
|
|
|
var s scalar.Any
|
|
s.Actual = gojqex.Normalize(r)
|
|
|
|
switch s.Actual.(type) {
|
|
case map[string]any,
|
|
[]any:
|
|
default:
|
|
d.Fatalf("root not object or array")
|
|
}
|
|
|
|
d.Value.V = &s
|
|
d.Value.Range.Len = d.Len()
|
|
|
|
return nil
|
|
}
|
|
|
|
func toYAML(_ *interp.Interp, c any) any {
|
|
b, err := yaml.Marshal(gojqex.Normalize(c))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return string(b)
|
|
}
|