| 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 |
| } |