parent
c228d3fcce
commit
9c17eb866b
21
decoder.go
21
decoder.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,7 +19,7 @@ func NewDecoder(r io.Reader) *Decoder {
|
||||||
return dec
|
return dec
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dec *Decoder) Decode() (ret interface{}, err error) {
|
func (dec *Decoder) Decode(e interface{}) (ret interface{}, err error) {
|
||||||
st := make([]byte, ST_ID_SIZE)
|
st := make([]byte, ST_ID_SIZE)
|
||||||
|
|
||||||
dec.mutex.Lock()
|
dec.mutex.Lock()
|
||||||
|
@ -39,5 +40,21 @@ func (dec *Decoder) Decode() (ret interface{}, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ret, err
|
return ret, err
|
||||||
}
|
}
|
||||||
return getVal(ret).Interface(), err
|
ret = getVal(ret).Interface()
|
||||||
|
|
||||||
|
if e != nil {
|
||||||
|
var v reflect.Value
|
||||||
|
if v, err = indirectValue(reflect.ValueOf(e)); err != nil {
|
||||||
|
return ret, ErrValueInvalid
|
||||||
|
}
|
||||||
|
if valueIsNil(v) {
|
||||||
|
return ret, ErrValueInvalid
|
||||||
|
}
|
||||||
|
if v.Type() != reflect.TypeOf(ret) {
|
||||||
|
return ret, ErrTypeMismatch
|
||||||
|
}
|
||||||
|
v.Set(reflect.ValueOf(ret))
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,7 +363,7 @@ func unmarshalStruct(e []byte, ntype *NType) (ie []byte, ret interface{}, err er
|
||||||
|
|
||||||
var v interface{}
|
var v interface{}
|
||||||
for i, field := range stype.structFields {
|
for i, field := range stype.structFields {
|
||||||
if i > rv.NumField() {
|
if field.SId > rv.NumField() {
|
||||||
return ie, ret, ErrTypeInvalid
|
return ie, ret, ErrTypeInvalid
|
||||||
}
|
}
|
||||||
if rv.Field(field.SId).CanSet() {
|
if rv.Field(field.SId).CanSet() {
|
||||||
|
@ -378,7 +378,6 @@ func unmarshalStruct(e []byte, ntype *NType) (ie []byte, ret interface{}, err er
|
||||||
}
|
}
|
||||||
// TODO: checks?
|
// TODO: checks?
|
||||||
rv.Field(i).Set(getVal(v))
|
rv.Field(i).Set(getVal(v))
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue