From 878fb83abd4003b50896b3dd3f9fcf242440991b Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Thu, 5 Mar 2020 02:11:12 +0300 Subject: add stat for streams --- pkg/pack/pack.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/pack/pack.go (limited to 'pkg/pack') diff --git a/pkg/pack/pack.go b/pkg/pack/pack.go new file mode 100644 index 0000000..e186773 --- /dev/null +++ b/pkg/pack/pack.go @@ -0,0 +1,57 @@ +package pack + +import ( + "encoding/binary" + "fmt" + "io" +) + +type Reader interface { + io.Reader + io.ByteReader +} + +type Encoder struct { + w io.Writer +} + +type Decoder struct { + r Reader +} + +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{w: w} +} + +func NewDecoder(r Reader) *Decoder { + return &Decoder{r: r} +} + +func (e *Encoder) Lps(b []byte) error { + buf := make([]byte, binary.MaxVarintLen64) + n := binary.PutVarint(buf, int64(len(b))) + + if _, err := e.w.Write(buf[:n]); err != nil { + return err + } + + _, err := e.w.Write(b) + return err +} + +func (d *Decoder) Lps() ([]byte, error) { + if n, err := binary.ReadVarint(d.r); err != nil { + return nil, fmt.Errorf("lps: %w", err) + } else { + buf := make([]byte, n) + + if _, err := io.ReadFull(d.r, buf); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return nil, fmt.Errorf("lps: %w", err) + } + + return buf, nil + } +} -- cgit v1.2.3-70-g09d2