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 }