diff options
Diffstat (limited to 'pkg/netstring')
| -rw-r--r-- | pkg/netstring/netstring.go | 55 |
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 +} |
