bencode.Encoder: Unembed the Writer and wrap it in a minimal interface

I won't remove the bufio.Buffer for Marshal now, it isn't a performance issue as far as I can tell, and I'd have to fake Flush().
This commit is contained in:
Matt Joiner 2016-06-15 15:09:34 +10:00
parent ac3b40ace3
commit 727d002e5a
2 changed files with 11 additions and 7 deletions

View File

@ -113,7 +113,7 @@ type Unmarshaler interface {
// error if any.
func Marshal(v interface{}) ([]byte, error) {
var buf bytes.Buffer
e := Encoder{Writer: bufio.NewWriter(&buf)}
e := Encoder{w: bufio.NewWriter(&buf)}
err := e.Encode(v)
if err != nil {
return nil, err
@ -133,5 +133,5 @@ func NewDecoder(r io.Reader) *Decoder {
}
func NewEncoder(w io.Writer) *Encoder {
return &Encoder{Writer: bufio.NewWriter(w)}
return &Encoder{w: bufio.NewWriter(w)}
}

View File

@ -1,7 +1,7 @@
package bencode
import (
"bufio"
"io"
"reflect"
"runtime"
"sort"
@ -16,7 +16,11 @@ func is_empty_value(v reflect.Value) bool {
}
type Encoder struct {
*bufio.Writer
w interface {
Flush() error
io.Writer
WriteString(string) (int, error)
}
scratch [64]byte
}
@ -37,7 +41,7 @@ func (e *Encoder) Encode(v interface{}) (err error) {
}
}()
e.reflect_value(reflect.ValueOf(v))
return e.Flush()
return e.w.Flush()
}
type string_values []reflect.Value
@ -48,14 +52,14 @@ func (sv string_values) Less(i, j int) bool { return sv.get(i) < sv.get(j) }
func (sv string_values) get(i int) string { return sv[i].String() }
func (e *Encoder) write(s []byte) {
_, err := e.Write(s)
_, err := e.w.Write(s)
if err != nil {
panic(err)
}
}
func (e *Encoder) write_string(s string) {
_, err := e.WriteString(s)
_, err := e.w.WriteString(s)
if err != nil {
panic(err)
}