diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-05 02:11:12 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-05 02:11:12 +0300 |
| commit | 878fb83abd4003b50896b3dd3f9fcf242440991b (patch) | |
| tree | 9479bd46b1d165fd0f687f6f658b0cb9b1773e95 /pkg/pack | |
| parent | ff51af3c48cee0d15c9802b2adb44f59a77e4c75 (diff) | |
add stat for streams
Diffstat (limited to 'pkg/pack')
| -rw-r--r-- | pkg/pack/pack.go | 57 |
1 files changed, 57 insertions, 0 deletions
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 + } +} |
