summaryrefslogtreecommitdiff
path: root/data/data.go
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2023-10-24 10:31:59 -0400
committerGitHub <noreply@github.com>2023-10-24 10:31:59 -0400
commitb669b8a8b58fd7d8fe175b7318cbb1444d839f99 (patch)
tree332769edad08e999a92c817256e485fbb91d5ea9 /data/data.go
parent52991c4a5c62c16f6cf7067c02fd610aab0ad9ee (diff)
Support for CUE (#1781)
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'data/data.go')
-rw-r--r--data/data.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/data/data.go b/data/data.go
index adf6b2b7..d2fc32fb 100644
--- a/data/data.go
+++ b/data/data.go
@@ -12,6 +12,9 @@ import (
"io"
"strings"
+ "cuelang.org/go/cue"
+ "cuelang.org/go/cue/cuecontext"
+ "cuelang.org/go/cue/format"
"github.com/Shopify/ejson"
ejsonJson "github.com/Shopify/ejson/json"
"github.com/hairyhenderson/gomplate/v4/conv"
@@ -442,3 +445,63 @@ func ToTOML(in interface{}) (string, error) {
}
return buf.String(), nil
}
+
+// CUE - Unmarshal a CUE expression into the appropriate type
+func CUE(in string) (interface{}, error) {
+ cuectx := cuecontext.New()
+ val := cuectx.CompileString(in)
+
+ if val.Err() != nil {
+ return nil, fmt.Errorf("unable to process CUE: %w", val.Err())
+ }
+
+ switch val.Kind() {
+ case cue.StructKind:
+ out := map[string]interface{}{}
+ err := val.Decode(&out)
+ return out, err
+ case cue.ListKind:
+ out := []interface{}{}
+ err := val.Decode(&out)
+ return out, err
+ case cue.BytesKind:
+ out := []byte{}
+ err := val.Decode(&out)
+ return out, err
+ case cue.StringKind:
+ out := ""
+ err := val.Decode(&out)
+ return out, err
+ case cue.IntKind:
+ out := 0
+ err := val.Decode(&out)
+ return out, err
+ case cue.NumberKind, cue.FloatKind:
+ out := 0.0
+ err := val.Decode(&out)
+ return out, err
+ case cue.BoolKind:
+ out := false
+ err := val.Decode(&out)
+ return out, err
+ case cue.NullKind:
+ return nil, nil
+ default:
+ return nil, fmt.Errorf("unsupported CUE type %q", val.Kind())
+ }
+}
+
+func ToCUE(in interface{}) (string, error) {
+ cuectx := cuecontext.New()
+ v := cuectx.Encode(in)
+ if v.Err() != nil {
+ return "", v.Err()
+ }
+
+ bs, err := format.Node(v.Syntax())
+ if err != nil {
+ return "", err
+ }
+
+ return string(bs), nil
+}