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 }