summaryrefslogtreecommitdiff
path: root/pkg/netstring
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/netstring')
-rw-r--r--pkg/netstring/netstring.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/pkg/netstring/netstring.go b/pkg/netstring/netstring.go
new file mode 100644
index 0000000..01b179a
--- /dev/null
+++ b/pkg/netstring/netstring.go
@@ -0,0 +1,55 @@
+package netstring
+
+import (
+ "errors"
+ "fmt"
+ "io"
+)
+
+type Encoder struct {
+ w io.Writer
+}
+
+type Decoder struct {
+ r io.Reader
+}
+
+var errBadFormat = errors.New("netstring: bad format")
+
+func NewEncoder(w io.Writer) *Encoder {
+ return &Encoder{w: w}
+}
+
+func NewDecoder(r io.Reader) *Decoder {
+ return &Decoder{r: r}
+}
+
+func (e *Encoder) Encode(s string) error {
+ _, err := fmt.Fprintf(e.w, "%d:%s,", len(s), s)
+ return err
+}
+
+func (d *Decoder) Decode() (out string, err error) {
+ var n int
+
+ _, err = fmt.Fscanf(d.r, "%d:", &n)
+ if err != nil {
+ return
+ }
+
+ buf := make([]byte, n + 1)
+
+ _, err = io.ReadFull(d.r, buf)
+ if err != nil {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return
+ }
+
+ if buf[n] != ',' {
+ return "", errBadFormat
+ }
+
+ return string(buf[:n]), nil
+}