From: Matt Joiner Date: Wed, 15 Jun 2016 05:09:34 +0000 (+1000) Subject: bencode.Encoder: Unembed the Writer and wrap it in a minimal interface X-Git-Tag: v1.0.0~685 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=727d002e5ac6cf6e671a7249dcd0d9cbfcac1dd0;p=btrtrc.git 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(). --- diff --git a/bencode/api.go b/bencode/api.go index 08f0411f..b5f026c5 100644 --- a/bencode/api.go +++ b/bencode/api.go @@ -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)} } diff --git a/bencode/encode.go b/bencode/encode.go index bfe208df..efd4faa4 100644 --- a/bencode/encode.go +++ b/bencode/encode.go @@ -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) }