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  }