32 lines
710 B
Go
32 lines
710 B
Go
|
package msgpack
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
|
||
|
"github.com/vmihailenco/msgpack/v4"
|
||
|
"github.com/zclconf/go-cty/cty"
|
||
|
)
|
||
|
|
||
|
type dynamicVal struct {
|
||
|
Value cty.Value
|
||
|
Path cty.Path
|
||
|
}
|
||
|
|
||
|
func (dv *dynamicVal) MarshalMsgpack() ([]byte, error) {
|
||
|
// Rather than defining a msgpack-specific serialization of types,
|
||
|
// instead we use the existing JSON serialization.
|
||
|
typeJSON, err := dv.Value.Type().MarshalJSON()
|
||
|
if err != nil {
|
||
|
return nil, dv.Path.NewErrorf("failed to serialize type: %s", err)
|
||
|
}
|
||
|
var buf bytes.Buffer
|
||
|
enc := msgpack.NewEncoder(&buf)
|
||
|
enc.EncodeArrayLen(2)
|
||
|
enc.EncodeBytes(typeJSON)
|
||
|
err = marshal(dv.Value, dv.Value.Type(), dv.Path, enc)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return buf.Bytes(), nil
|
||
|
}
|