package ssob import ( "encoding/binary" "fmt" "io" "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() (ret interface{}, err error) { st := make([]byte, ST_ID_SIZE) dec.mutex.Lock() defer dec.mutex.Unlock() if err = binary.Read(dec.r, binary.BigEndian, st); err != nil { return nil, err } l := binary.BigEndian.Uint32(st) b := make([]byte, l) if err = binary.Read(dec.r, binary.BigEndian, b); err != nil { return nil, fmt.Errorf("ssob: Cannot decode value: %w", err) } _, ret, err = unmarshalVal(b) if err != nil { return ret, err } return getVal(ret).Interface(), err }