diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2023-10-24 10:31:59 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-24 10:31:59 -0400 |
| commit | b669b8a8b58fd7d8fe175b7318cbb1444d839f99 (patch) | |
| tree | 332769edad08e999a92c817256e485fbb91d5ea9 /data/data.go | |
| parent | 52991c4a5c62c16f6cf7067c02fd610aab0ad9ee (diff) | |
Support for CUE (#1781)
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'data/data.go')
| -rw-r--r-- | data/data.go | 63 |
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 +} |
