github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/operator/builtin/input/file/positional_scanner.go (about)

     1  package file
     2  
     3  import (
     4  	"bufio"
     5  	"io"
     6  )
     7  
     8  type PositionalScanner struct {
     9  	pos int64
    10  	*bufio.Scanner
    11  }
    12  
    13  func NewPositionalScanner(r io.Reader, maxLogSize int, startOffset int64, splitFunc bufio.SplitFunc) *PositionalScanner {
    14  	ps := &PositionalScanner{
    15  		pos:     startOffset,
    16  		Scanner: bufio.NewScanner(r),
    17  	}
    18  
    19  	buf := make([]byte, 0, 16384)
    20  	ps.Scanner.Buffer(buf, maxLogSize)
    21  
    22  	scanFunc := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
    23  		advance, token, err = splitFunc(data, atEOF)
    24  		ps.pos += int64(advance)
    25  		return
    26  	}
    27  	ps.Scanner.Split(scanFunc)
    28  	return ps
    29  }
    30  
    31  func (ps *PositionalScanner) Pos() int64 {
    32  	return ps.pos
    33  }