@@ -28,26 +28,46 @@ func init() {
28
28
ProbeOrder : format .ProbeOrderTextFuzzy ,
29
29
Groups : []* decode.Group {format .Probe },
30
30
DecodeFn : decodeYAML ,
31
- Functions : []string {"_todisplay" },
31
+ DefaultInArg : format.YAML_In {
32
+ MultiDocument : false ,
33
+ },
34
+ Functions : []string {"_todisplay" },
32
35
})
33
36
interp .RegisterFS (yamlFS )
34
37
interp .RegisterFunc1 ("_to_yaml" , toYAML )
35
38
}
36
39
37
40
func decodeYAML (d * decode.D ) any {
41
+ var yi format.YAML_In
42
+ d .ArgAs (& yi )
43
+
38
44
br := d .RawLen (d .Len ())
39
- var r any
45
+
46
+ var vs []any
40
47
41
48
yd := yaml .NewDecoder (bitio .NewIOReader (br ))
42
- if err := yd .Decode (& r ); err != nil {
43
- d .Fatalf ("%s" , err )
44
- }
45
- if err := yd .Decode (new (any )); ! errors .Is (err , io .EOF ) {
46
- d .Fatalf ("trialing data after top-level value" )
49
+ for {
50
+ var v any
51
+ err := yd .Decode (& v )
52
+ if err != nil {
53
+ if len (vs ) == 0 {
54
+ d .Fatalf ("%s" , err )
55
+ } else if errors .Is (err , io .EOF ) {
56
+ break
57
+ } else {
58
+ d .Fatalf ("trialing data after document" )
59
+ }
60
+ }
61
+
62
+ vs = append (vs , v )
47
63
}
48
64
49
65
var s scalar.Any
50
- s .Actual = gojqx .Normalize (r )
66
+ if ! yi .MultiDocument && len (vs ) == 1 {
67
+ s .Actual = gojqx .Normalize (vs [0 ])
68
+ } else {
69
+ s .Actual = gojqx .Normalize (vs )
70
+ }
51
71
52
72
switch s .Actual .(type ) {
53
73
case map [string ]any ,
@@ -63,18 +83,32 @@ func decodeYAML(d *decode.D) any {
63
83
}
64
84
65
85
type ToYAMLOpts struct {
66
- Indent int `default:"4"` // 4 is default for gopkg.in/yaml.v3
86
+ Indent int `default:"4"` // 4 is default for gopkg.in/yaml.v3
87
+ MultiDocument bool `default:"false"`
67
88
}
68
89
69
90
func toYAML (_ * interp.Interp , c any , opts ToYAMLOpts ) any {
91
+ c = gojqx .Normalize (c )
92
+
93
+ cs , isArray := c .([]any )
94
+ if opts .MultiDocument {
95
+ if ! isArray {
96
+ return gojqx.FuncTypeError {Name : "to_yaml" , V : c }
97
+ }
98
+ } else {
99
+ cs = []any {c }
100
+ }
101
+
70
102
b := & bytes.Buffer {}
71
103
e := yaml .NewEncoder (b )
72
- // yaml.SetIndent panics if < 0
73
- if opts .Indent >= 0 {
74
- e .SetIndent (opts .Indent )
75
- }
76
- if err := e .Encode (gojqx .Normalize (c )); err != nil {
77
- return err
104
+ for _ , c := range cs {
105
+ // yaml.SetIndent panics if < 0
106
+ if opts .Indent >= 0 {
107
+ e .SetIndent (opts .Indent )
108
+ }
109
+ if err := e .Encode (gojqx .Normalize (c )); err != nil {
110
+ return err
111
+ }
78
112
}
79
113
80
114
return b .String ()
0 commit comments