diff --git a/backend.go b/backend.go index b64f006c..7f11bc7f 100644 --- a/backend.go +++ b/backend.go @@ -4,12 +4,11 @@ import ( "encoding/binary" "io" - "github.com/jackc/chunkreader" "github.com/pkg/errors" ) type Backend struct { - cr *chunkreader.ChunkReader + cr ChunkReader w io.Writer // Frontend message flyweights @@ -31,8 +30,7 @@ type Backend struct { partialMsg bool } -func NewBackend(r io.Reader, w io.Writer) (*Backend, error) { - cr := chunkreader.NewChunkReader(r) +func NewBackend(cr ChunkReader, w io.Writer) (*Backend, error) { return &Backend{cr: cr, w: w}, nil } diff --git a/backend_test.go b/backend_test.go index a26f2c40..6cba81b6 100644 --- a/backend_test.go +++ b/backend_test.go @@ -12,7 +12,7 @@ func TestBackendReceiveInterrupted(t *testing.T) { server := &interruptReader{} server.push([]byte{'Q', 0, 0, 0, 6}) - backend, err := pgproto3.NewBackend(server, nil) + backend, err := pgproto3.NewBackend(pgproto3.NewChunkReader(server), nil) if err != nil { t.Fatal(err) } diff --git a/chunkreader.go b/chunkreader.go new file mode 100644 index 00000000..230335c4 --- /dev/null +++ b/chunkreader.go @@ -0,0 +1,18 @@ +package pgproto3 + +import ( + "io" + + "github.com/jackc/chunkreader" +) + +// ChunkReader is an interface to decouple github.com/jackc/chunkreader from this package. +type ChunkReader interface { + // Next returns buf filled with the next n bytes. If an error occurs, buf will be nil. Next must + // not reuse buf. In case of error, Next must preserve partially read data. + Next(n int) (buf []byte, err error) +} + +func NewChunkReader(r io.Reader) ChunkReader { + return chunkreader.NewChunkReader(r) +} diff --git a/frontend.go b/frontend.go index 00cb68b4..ce94f49f 100644 --- a/frontend.go +++ b/frontend.go @@ -4,12 +4,11 @@ import ( "encoding/binary" "io" - "github.com/jackc/chunkreader" "github.com/pkg/errors" ) type Frontend struct { - cr *chunkreader.ChunkReader + cr ChunkReader w io.Writer // Backend message flyweights @@ -42,8 +41,7 @@ type Frontend struct { partialMsg bool } -func NewFrontend(r io.Reader, w io.Writer) (*Frontend, error) { - cr := chunkreader.NewChunkReader(r) +func NewFrontend(cr ChunkReader, w io.Writer) (*Frontend, error) { return &Frontend{cr: cr, w: w}, nil } diff --git a/frontend_test.go b/frontend_test.go index 49484e01..d3e57f81 100644 --- a/frontend_test.go +++ b/frontend_test.go @@ -37,7 +37,7 @@ func TestFrontendReceiveInterrupted(t *testing.T) { server := &interruptReader{} server.push([]byte{'Z', 0, 0, 0, 5}) - frontend, err := pgproto3.NewFrontend(server, nil) + frontend, err := pgproto3.NewFrontend(pgproto3.NewChunkReader(server), nil) if err != nil { t.Fatal(err) }