...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package json
16
17 import (
18 "bytes"
19 "encoding/json"
20 "fmt"
21 "io"
22 "strings"
23
24 "cuelang.org/go/cue"
25 "cuelang.org/go/cue/ast"
26 "cuelang.org/go/cue/errors"
27 "cuelang.org/go/cue/parser"
28 "cuelang.org/go/cue/token"
29 cuejson "cuelang.org/go/encoding/json"
30 internaljson "cuelang.org/go/internal/encoding/json"
31 )
32
33
34
35 func Compact(src []byte) (string, error) {
36 dst := bytes.Buffer{}
37 if err := json.Compact(&dst, src); err != nil {
38 return "", err
39 }
40 return dst.String(), nil
41 }
42
43
44
45
46
47
48
49
50
51
52
53
54 func Indent(src []byte, prefix, indent string) (string, error) {
55 dst := bytes.Buffer{}
56 if err := json.Indent(&dst, src, prefix, indent); err != nil {
57 return "", err
58 }
59 return dst.String(), nil
60 }
61
62
63
64
65
66
67 func HTMLEscape(src []byte) string {
68 dst := &bytes.Buffer{}
69 json.HTMLEscape(dst, src)
70 return dst.String()
71 }
72
73
74 func Marshal(v cue.Value) (string, error) {
75 b, err := internaljson.Marshal(v)
76 return string(b), err
77 }
78
79
80 func MarshalStream(v cue.Value) (string, error) {
81
82 iter, err := v.List()
83 if err != nil {
84 return "", err
85 }
86 var b strings.Builder
87 for iter.Next() {
88 p, err := internaljson.Marshal(iter.Value())
89 if err != nil {
90 return "", err
91 }
92 b.Write(p)
93 b.WriteByte('\n')
94 }
95 return b.String(), nil
96 }
97
98
99 func UnmarshalStream(data []byte) (ast.Expr, error) {
100 var r cue.Runtime
101 d := cuejson.NewDecoder(&r, "", bytes.NewReader(data))
102
103 a := []ast.Expr{}
104 for {
105 x, err := d.Extract()
106 if err == io.EOF {
107 break
108 }
109 if err != nil {
110 return nil, err
111 }
112 a = append(a, x)
113 }
114
115 return ast.NewList(a...), nil
116 }
117
118
119 func Unmarshal(b []byte) (ast.Expr, error) {
120 if !json.Valid(b) {
121 return nil, fmt.Errorf("json: invalid JSON")
122 }
123 expr, err := parser.ParseExpr("json", b)
124 if err != nil {
125
126 return nil, errors.Wrapf(err, token.NoPos, "json: could not parse JSON")
127 }
128 return expr, nil
129 }
130
131
132
133 func Validate(b []byte, v cue.Value) (bool, error) {
134 err := cuejson.Validate(b, v)
135 if err != nil {
136 return false, err
137 }
138 return true, nil
139 }
140
View as plain text