summaryrefslogtreecommitdiff
path: root/pkg/pack/pack.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/pack/pack.go')
-rw-r--r--pkg/pack/pack.go57
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
+ }
+}