github.com/KEINOS/go-countline@v1.1.1-0.20221217083629-60710df7606b/cl/_alt/alt5.go (about) 1 //nolint:revive,stylecheck 2 package _alt 3 4 import ( 5 "bufio" 6 "io" 7 8 "github.com/pkg/errors" 9 ) 10 11 const bufSizeDefault = 1024 12 13 // CountLinesAlt5 uses bufio.Scanner to count the number of lines. 14 func CountLinesAlt5(inputReader io.Reader) (int, error) { 15 return countLinesAlt5(inputReader, bufSizeDefault) 16 } 17 18 func countLinesAlt5(inputReader io.Reader, bufSize int) (int, error) { 19 if inputReader == nil { 20 return 0, errors.New("given reader is nil") 21 } 22 23 bufScanner := bufio.NewScanner(inputReader) 24 25 buf := make([]byte, bufSize) 26 bufScanner.Buffer(buf, bufSize) 27 28 countLine := 0 29 30 for bufScanner.Scan() { 31 countLine++ 32 } 33 34 if err := bufScanner.Err(); err != nil { 35 if errors.Is(err, bufio.ErrTooLong) { 36 return countLinesAlt5(inputReader, bufSize*bufSizeDefault) 37 } 38 39 return 0, errors.Wrap(err, "failed to scan reader") 40 } 41 42 return countLine, nil 43 }