Commit eadf5c4a authored by Kirill Smelkov's avatar Kirill Smelkov

xio, xbufio: New packages amending std packages io & bufio

Currently by direct & buffered readers that also can report current
offset in input stream.

This functionality is handy to have when for example one needs to report
an error after finding decoding problem and wants to include particular
stream position in the report.
parent c6520b42
// Copyright (C) 2017 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// 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
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
// Package xbufio provides addons to std package bufio.
package xbufio
import (
"bufio"
"io"
"lab.nexedi.com/kirr/go123/xio"
)
// Reader is a bufio.Reader that also reports current logical position in input stream.
type Reader struct {
*bufio.Reader
cr *xio.CountedReader
}
func NewReader(r io.Reader) *Reader {
// idempotent(Reader)
if r, ok := r.(*Reader); ok {
return r
}
// idempotent(xio.CountedReader)
cr, ok := r.(*xio.CountedReader)
if !ok {
cr = xio.CountReader(r)
}
return &Reader{bufio.NewReader(cr), cr}
}
// InputOffset returns current logical position in input stream.
func (r *Reader) InputOffset() int64 {
return r.cr.InputOffset() - int64(r.Reader.Buffered())
}
// Copyright (C) 2017 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// 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
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
// Package xio provides addons to standard package io.
package xio
import "io"
// CountedReader is an io.Reader that count total bytes read.
type CountedReader struct {
r io.Reader
nread int64
}
func (cr *CountedReader) Read(p []byte) (int, error) {
n, err := cr.r.Read(p)
cr.nread += int64(n)
return n, err
}
// InputOffset returns the number of bytes read.
func (cr *CountedReader) InputOffset() int64 {
return cr.nread
}
// CountReader wraps r with CountedReader
func CountReader(r io.Reader) *CountedReader {
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