blob: 2625ffbb34eba5bf701f970d6f056551297a65d3 [file] [log] [blame]
package transcoder
import (
"reflect"
"v.io/v23/vdl"
)
func Encode(value interface{}) ([]byte, error) {
enc := &encoder{
allocator: &allocator{},
}
err := vdl.FromReflect(enc, reflect.ValueOf(value))
return enc.Bytes(), err
}
type encoder struct {
allocator *allocator
}
func (e *encoder) Bytes() []byte {
return e.allocator.AllocatedBytes()
}
func (e *encoder) FromBool(src bool, tt *vdl.Type) error {
panic("cannot encode top level bool")
}
func (e *encoder) FromUint(src uint64, tt *vdl.Type) error {
panic("cannot encode top level uint")
}
func (e *encoder) FromInt(src int64, tt *vdl.Type) error {
panic("cannot encode top level int")
}
func (e *encoder) FromFloat(src float64, tt *vdl.Type) error {
panic("cannot encode top level float")
}
func (e *encoder) FromComplex(src complex128, tt *vdl.Type) error {
panic("cannot encode top level complex")
}
func (e *encoder) FromBytes(src []byte, tt *vdl.Type) error {
panic("cannot encode top level bytes")
}
func (e *encoder) FromString(src string, tt *vdl.Type) error {
panic("cannot encode top level string")
}
func (e *encoder) FromEnumLabel(src string, tt *vdl.Type) error {
panic("cannot encode top level enum")
}
func (e *encoder) FromTypeObject(src *vdl.Type) error {
panic("cannot encode top level type object")
}
func (e *encoder) FromNil(tt *vdl.Type) error {
panic("cannot encode top level nil")
}
func (e *encoder) StartList(tt *vdl.Type, len int) (vdl.ListTarget, error) {
panic("UNIMPLEMENTED")
return nil, nil
}
func (e *encoder) FinishList(x vdl.ListTarget) error {
return nil
}
func (e *encoder) StartSet(tt *vdl.Type, len int) (vdl.SetTarget, error) {
panic("UNIMPLEMENTED")
}
func (e *encoder) FinishSet(x vdl.SetTarget) error {
panic("UNIMPLEMENTED")
}
func (e *encoder) StartMap(tt *vdl.Type, len int) (vdl.MapTarget, error) {
panic("UNIMPLEMENTED")
}
func (e *encoder) FinishMap(x vdl.MapTarget) error {
panic("UNIMPLEMENTED")
}
func (e *encoder) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
if tt.Kind() == vdl.Union {
panic("not yet supported")
}
if tt.Kind() == vdl.Optional {
tt = tt.Elem()
}
block := e.allocator.Allocate(neededStructAllocationSize(tt), 0)
return fieldsTarget{
vdlType: tt,
block: block,
},
nil
}
func (e *encoder) FinishFields(x vdl.FieldsTarget) error {
return nil
}