ssob/decoder.go

44 lines
734 B
Go
Raw Normal View History

2019-10-04 12:28:45 +02:00
package ssob
import (
"encoding/binary"
"fmt"
2019-10-04 12:28:45 +02:00
"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
}
2021-09-07 16:05:04 +02:00
func (dec *Decoder) Decode() (ret interface{}, err error) {
2021-09-02 00:08:59 +02:00
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
}
2021-09-06 23:33:50 +02:00
l := binary.BigEndian.Uint32(st)
b := make([]byte, l)
2021-09-07 16:05:04 +02:00
if err = binary.Read(dec.r, binary.BigEndian, b); err != nil {
2021-09-06 23:33:50 +02:00
return nil, fmt.Errorf("ssob: Cannot decode value: %w", err)
}
_, ret, err = unmarshalVal(b)
if err != nil {
return ret, err
2021-09-02 00:08:59 +02:00
}
2021-09-06 23:33:50 +02:00
return getVal(ret).Interface(), err
2021-09-02 00:08:59 +02:00
}