...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package yaml
18
19 import (
20 "bytes"
21 "io"
22
23 "cuelang.org/go/cue"
24 "cuelang.org/go/cue/ast"
25 cueyaml "cuelang.org/go/internal/encoding/yaml"
26 "cuelang.org/go/internal/third_party/yaml"
27 pkgyaml "cuelang.org/go/pkg/encoding/yaml"
28 )
29
30
31
32
33
34
35 func Extract(filename string, src interface{}) (*ast.File, error) {
36 a := []ast.Expr{}
37 d, err := yaml.NewDecoder(filename, src)
38 if err != nil {
39 return nil, err
40 }
41 for {
42 expr, err := d.Decode()
43 if err != nil {
44 if err != io.EOF {
45 return nil, err
46 }
47 if expr != nil {
48 a = append(a, expr)
49 }
50 break
51 }
52 a = append(a, expr)
53 }
54 f := &ast.File{Filename: filename}
55 switch len(a) {
56 case 0:
57 case 1:
58 switch x := a[0].(type) {
59 case *ast.StructLit:
60 f.Decls = x.Elts
61 default:
62 f.Decls = []ast.Decl{&ast.EmbedDecl{Expr: x}}
63 }
64 default:
65 f.Decls = []ast.Decl{&ast.EmbedDecl{Expr: &ast.ListLit{Elts: a}}}
66 }
67 return f, nil
68 }
69
70
71
72
73
74 func Decode(r *cue.Runtime, filename string, src interface{}) (*cue.Instance, error) {
75 file, err := Extract(filename, src)
76 if err != nil {
77 return nil, err
78 }
79 return r.CompileFile(file)
80 }
81
82
83 func Encode(v cue.Value) ([]byte, error) {
84 n := v.Syntax(cue.Final())
85 b, err := cueyaml.Encode(n)
86 return b, err
87 }
88
89
90
91 func EncodeStream(iter cue.Iterator) ([]byte, error) {
92
93 buf := &bytes.Buffer{}
94 for i := 0; iter.Next(); i++ {
95 if i > 0 {
96 buf.WriteString("---\n")
97 }
98 n := iter.Value().Syntax(cue.Final())
99 b, err := cueyaml.Encode(n)
100 if err != nil {
101 return nil, err
102 }
103 buf.Write(b)
104 }
105 return buf.Bytes(), nil
106 }
107
108
109
110 func Validate(b []byte, v cue.Value) error {
111 _, err := pkgyaml.Validate(b, v)
112 return err
113 }
114
View as plain text