]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode.Encoder: Unembed the Writer and wrap it in a minimal interface
authorMatt Joiner <anacrolix@gmail.com>
Wed, 15 Jun 2016 05:09:34 +0000 (15:09 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 15 Jun 2016 05:09:34 +0000 (15:09 +1000)
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().

bencode/api.go
bencode/encode.go

index 08f0411f0e6f07c4ee5c8f15f21059f02d4a2b86..b5f026c5ce58a65390b5817038fb0d856b6d031a 100644 (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)}
 }
index bfe208dfc35a9024b91a545855512113ca7c3e32..efd4faa4c2224959a42b954996032c71b1d49e03 100644 (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)
        }