Commit 0e368363 authored by Kirill Smelkov's avatar Kirill Smelkov

xio: Convert CountReader from io.Reader -> to xio.Reader

Done toprovide uniform API in xio package.
Compensate for API change in places where xio.CountReader was used.
parent 7ad867a3
// Copyright (C) 2017 Nexedi SA and Contributors. // Copyright (C) 2017-2019 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com> // Kirill Smelkov <kirr@nexedi.com>
// //
// This program is free software: you can Use, Study, Modify and Redistribute // This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your // it under the terms of the GNU General Public License version 3, or (at your
...@@ -22,6 +22,7 @@ package xbufio ...@@ -22,6 +22,7 @@ package xbufio
import ( import (
"bufio" "bufio"
"context"
"io" "io"
"lab.nexedi.com/kirr/go123/xio" "lab.nexedi.com/kirr/go123/xio"
...@@ -40,12 +41,13 @@ func NewReader(r io.Reader) *Reader { ...@@ -40,12 +41,13 @@ func NewReader(r io.Reader) *Reader {
} }
// idempotent(xio.CountedReader) // idempotent(xio.CountedReader)
cr, ok := r.(*xio.CountedReader) xr := xio.WithCtxR(r)
cr, ok := xr.(*xio.CountedReader)
if !ok { if !ok {
cr = xio.CountReader(r) cr = xio.CountReader(xr)
} }
return &Reader{bufio.NewReader(cr), cr} return &Reader{bufio.NewReader(xio.BindCtxR(cr, context.Background())), cr}
} }
// InputOffset returns current logical position in input stream. // InputOffset returns current logical position in input stream.
......
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
// It is the opposite operation for BindCtx, but for arbitrary io.X // It is the opposite operation for BindCtx, but for arbitrary io.X
// returned xio.X handles context only on best-effort basis. In // returned xio.X handles context only on best-effort basis. In
// particular IO cancellation is not reliably handled for os.File . // particular IO cancellation is not reliably handled for os.File .
//
// Miscellaneous utilities:
//
// - CountReader provides InputOffset for a Reader.
package xio package xio
import ( import (
...@@ -272,14 +276,14 @@ func (s *stubCtxRWC) Close() error { return s.rw.Close() } ...@@ -272,14 +276,14 @@ func (s *stubCtxRWC) Close() error { return s.rw.Close() }
// ---------------------------------------- // ----------------------------------------
// CountedReader is an io.Reader that count total bytes read. // CountedReader is a Reader that count total bytes read.
type CountedReader struct { type CountedReader struct {
r io.Reader r Reader
nread int64 nread int64
} }
func (cr *CountedReader) Read(p []byte) (int, error) { func (cr *CountedReader) Read(ctx context.Context, p []byte) (int, error) {
n, err := cr.r.Read(p) n, err := cr.r.Read(ctx, p)
cr.nread += int64(n) cr.nread += int64(n)
return n, err return n, err
} }
...@@ -290,6 +294,6 @@ func (cr *CountedReader) InputOffset() int64 { ...@@ -290,6 +294,6 @@ func (cr *CountedReader) InputOffset() int64 {
} }
// CountReader wraps r with CountedReader. // CountReader wraps r with CountedReader.
func CountReader(r io.Reader) *CountedReader { func CountReader(r Reader) *CountedReader {
return &CountedReader{r, 0} return &CountedReader{r, 0}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment