From 727d002e5ac6cf6e671a7249dcd0d9cbfcac1dd0 Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
Date: Wed, 15 Jun 2016 15:09:34 +1000
Subject: [PATCH] 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().
---
 bencode/api.go    |  4 ++--
 bencode/encode.go | 14 +++++++++-----
 2 files changed, 11 insertions(+), 7 deletions(-)

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)
 	}
-- 
2.51.0