github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/filesystem/fileinfo.go (about)

     1  // Package filesystem - Content managed by Project Forge, see [projectforge.md] for details.
     2  package filesystem
     3  
     4  import (
     5  	"cmp"
     6  	"io/fs"
     7  	"slices"
     8  
     9  	"github.com/samber/lo"
    10  )
    11  
    12  var (
    13  	DirectoryMode = FileMode(0o755)
    14  	DefaultMode   = FileMode(0o644)
    15  )
    16  
    17  type FileMode uint32
    18  
    19  func (m FileMode) ToFS() fs.FileMode {
    20  	return fs.FileMode(m)
    21  }
    22  
    23  type FileInfo struct {
    24  	Name  string
    25  	Size  int64
    26  	Mode  FileMode
    27  	IsDir bool
    28  }
    29  
    30  func (i FileInfo) Equal(x *FileInfo) bool {
    31  	return i.Name == x.Name && i.Size == x.Size && i.Mode == x.Mode && i.IsDir == x.IsDir
    32  }
    33  
    34  func FileInfoFromFS(s fs.FileInfo) *FileInfo {
    35  	return &FileInfo{Name: s.Name(), Size: s.Size(), Mode: FileMode(s.Mode()), IsDir: s.IsDir()}
    36  }
    37  
    38  func FileInfoFromDE(e fs.DirEntry) *FileInfo {
    39  	i, _ := e.Info()
    40  	return &FileInfo{Name: e.Name(), Size: i.Size(), Mode: FileMode(i.Mode()), IsDir: e.IsDir()}
    41  }
    42  
    43  type FileInfos []*FileInfo
    44  
    45  func FileInfosFromFS(x []fs.FileInfo) FileInfos {
    46  	return lo.Map(x, func(x fs.FileInfo, _ int) *FileInfo {
    47  		return FileInfoFromFS(x)
    48  	})
    49  }
    50  
    51  func (f FileInfos) Sorted() FileInfos {
    52  	slices.SortFunc(f, func(l *FileInfo, r *FileInfo) int {
    53  		return cmp.Compare(l.Name, r.Name)
    54  	})
    55  	return f
    56  }
    57  
    58  func (f FileInfos) Equal(x FileInfos) bool {
    59  	if len(f) != len(x) {
    60  		return false
    61  	}
    62  	for idx, i := range f {
    63  		if !i.Equal(x[idx]) {
    64  			return false
    65  		}
    66  	}
    67  	return true
    68  }