-
Notifications
You must be signed in to change notification settings - Fork 312
/
Copy pathmanual.go
118 lines (104 loc) · 3.36 KB
/
manual.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright 2018 The CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package yaml
import (
"bytes"
"io"
"cuelang.org/go/cue"
"cuelang.org/go/cue/ast"
"cuelang.org/go/internal/core/adt"
cueyaml "cuelang.org/go/internal/encoding/yaml"
"cuelang.org/go/internal/pkg"
"cuelang.org/go/internal/value"
)
// Marshal returns the YAML encoding of v.
func Marshal(v cue.Value) (string, error) {
if err := v.Validate(cue.Concrete(true)); err != nil {
return "", err
}
n := v.Syntax(cue.Final(), cue.Concrete(true))
b, err := cueyaml.Encode(n)
return string(b), err
}
// MarshalStream returns the YAML encoding of v.
func MarshalStream(v cue.Value) (string, error) {
// TODO: return an io.Reader and allow asynchronous processing.
iter, err := v.List()
if err != nil {
return "", err
}
buf := &bytes.Buffer{}
for i := 0; iter.Next(); i++ {
if i > 0 {
buf.WriteString("---\n")
}
v := iter.Value()
if err := v.Validate(cue.Concrete(true)); err != nil {
return "", err
}
n := v.Syntax(cue.Final(), cue.Concrete(true))
b, err := cueyaml.Encode(n)
if err != nil {
return "", err
}
buf.Write(b)
}
return buf.String(), nil
}
// Unmarshal parses the YAML to a CUE expression.
func Unmarshal(data []byte) (ast.Expr, error) {
return cueyaml.Unmarshal("", data)
}
// UnmarshalStream parses the YAML to a CUE list expression on success.
func UnmarshalStream(data []byte) (ast.Expr, error) {
d := cueyaml.NewDecoder("", data)
a := []ast.Expr{}
for {
x, err := d.Decode()
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
a = append(a, x)
}
return ast.NewList(a...), nil
}
// Validate validates YAML and confirms it is an instance of schema.
// If the YAML source is a stream, every object must match v.
func Validate(b []byte, v pkg.Schema) (bool, error) {
// This function is left for Go documentation. The package entry calls
// cueyaml.Validate directly, passing it the call context.
ctx := value.OpContext(v)
return cueyaml.Validate(ctx, b, v)
}
// validate is the actual implementation of Validate.
func validate(c *adt.OpContext, b []byte, v pkg.Schema) (bool, error) {
return cueyaml.Validate(c, b, v)
}
// ValidatePartial validates YAML and confirms it matches the constraints
// specified by v using unification. This means that b must be consistent with,
// but does not have to be an instance of v. If the YAML source is a stream,
// every object must match v.
func ValidatePartial(b []byte, v pkg.Schema) (bool, error) {
// This function is left for Go documentation. The package entry calls
// cueyaml.ValidatePartial directly, passing it the call context.
ctx := value.OpContext(v)
return cueyaml.ValidatePartial(ctx, b, v)
}
// validatePartial is the actual implementation of ValidatePartial.
func validatePartial(c *adt.OpContext, b []byte, v pkg.Schema) (bool, error) {
return cueyaml.ValidatePartial(c, b, v)
}