github.com/pavlo67/common@v0.5.3/common/filelib/files_numbered.go (about)

     1  package filelib
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"regexp"
     8  	"strconv"
     9  )
    10  
    11  type NumberedFile struct {
    12  	I    int
    13  	Path string
    14  }
    15  
    16  func NumberedFilesSequence(dir, filenameRegexp string, allowLeaks bool) ([]NumberedFile, error) {
    17  	reFilename, err := regexp.Compile(filenameRegexp)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	files, err := os.ReadDir(dir)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	var fns []NumberedFile
    28  	nextNum := -1
    29  
    30  	for _, file := range files {
    31  		if matches := reFilename.FindStringSubmatch(file.Name()); len(matches) == 2 {
    32  			num, err := strconv.Atoi(matches[1])
    33  			if err != nil {
    34  				return nil, fmt.Errorf("converting num (%v) from filename (%s) got: %s", matches, file.Name(), err)
    35  			} else if nextNum == -1 {
    36  				nextNum = num
    37  			} else if num != nextNum && !allowLeaks {
    38  				return nil, fmt.Errorf("frames leak: after %d got %d", nextNum-1, num)
    39  			}
    40  			fns = append(fns, NumberedFile{num, filepath.Join(dir, file.Name())})
    41  			nextNum++
    42  		}
    43  	}
    44  
    45  	return fns, nil
    46  }