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 }