ssob/decoder.go

57 lines
1015 B
Go

package ssob
import (
"encoding/binary"
"errors"
"io"
"reflect"
"sync"
)
type Decoder struct {
mutex sync.Mutex
r io.Reader
}
func NewDecoder(r io.Reader) *Decoder {
dec := new(Decoder)
dec.r = r
return dec
}
func (dec *Decoder) Decode(e interface{}) (err error) {
return dec.DecodeValue(reflect.ValueOf(e))
}
func (dec *Decoder) DecodeValue(value reflect.Value) (err error) {
if value.Kind() == reflect.Invalid {
return errors.New("ssob: Cannot decode nil value")
}
if value.Kind() == reflect.Ptr && value.IsNil() {
return errors.New("ssob: Cannot decode nil of type " + value.Type().String())
}
dec.mutex.Lock()
defer dec.mutex.Unlock()
lb := make([]byte, 8)
err = binary.Read(dec.r, binary.BigEndian, lb)
if err != nil {
return err
}
l, n, err := unmarshalInt64(lb)
if err != nil || n != 8 {
return err
}
bb := make([]byte, l)
err = binary.Read(dec.r, binary.BigEndian, bb)
if err != nil {
return err
}
_, err = unmarshal(value.Interface(), bb)
return err
}