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 Encode(s string) string { return fmt.Sprintf("%d:%s,", len(s), s) } */ 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 "", fmt.Errorf("netstring: %w", err) } buf := make([]byte, n+1) _, err = io.ReadFull(d.r, buf) if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } return "", fmt.Errorf("netstring: %w", err) } if buf[n] != ',' { return "", errBadFormat } return string(buf[:n]), nil }