package stdlib import ( "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/function" "github.com/zclconf/go-cty/cty/json" ) var JSONEncodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "val", Type: cty.DynamicPseudoType, AllowDynamicType: true, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { val := args[0] if !val.IsWhollyKnown() { // We can't serialize unknowns, so if the value is unknown or // contains any _nested_ unknowns then our result must be // unknown. return cty.UnknownVal(retType), nil } buf, err := json.Marshal(val, val.Type()) if err != nil { return cty.NilVal, err } return cty.StringVal(string(buf)), nil }, }) var JSONDecodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, }, Type: func(args []cty.Value) (cty.Type, error) { str := args[0] if !str.IsKnown() { return cty.DynamicPseudoType, nil } buf := []byte(str.AsString()) return json.ImpliedType(buf) }, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { buf := []byte(args[0].AsString()) return json.Unmarshal(buf, retType) }, }) // JSONEncode returns a JSON serialization of the given value. func JSONEncode(val cty.Value) (cty.Value, error) { return JSONEncodeFunc.Call([]cty.Value{val}) } // JSONDecode parses the given JSON string and, if it is valid, returns the // value it represents. // // Note that applying JSONDecode to the result of JSONEncode may not produce // an identically-typed result, since JSON encoding is lossy for cty Types. // The resulting value will consist only of primitive types, object types, and // tuple types. func JSONDecode(str cty.Value) (cty.Value, error) { return JSONDecodeFunc.Call([]cty.Value{str}) }