package ssob import ( "fmt" "io" "sync" ) type Encoder struct { mutex sync.Mutex w io.Writer } func NewEncoder(w io.Writer) *Encoder { enc := new(Encoder) enc.w = w return enc } func (enc *Encoder) Encode(e interface{}) (err error) { _, v, err := parseInterface(e) if err != nil { return err } var b []byte if b, err = marshalVal(v.Interface()); err != nil { return fmt.Errorf("ssob: Cannot encode value: %w", err) } wb := marshalUint32(uint32(len(b))) wb = append(wb, b...) enc.mutex.Lock() defer enc.mutex.Unlock() if _, err = enc.w.Write(wb); err != nil { return fmt.Errorf("ssob: Cannot encode value: %w", err) } return nil }