github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/cataloger/golang/subfs.go (about) 1 package golang 2 3 import ( 4 "io/fs" 5 "path" 6 "time" 7 ) 8 9 type subFS struct { 10 root string 11 f fs.FS 12 } 13 14 func getSubFS(f fs.FS, root string) fs.FS { 15 if s, ok := f.(fs.SubFS); ok { 16 s, err := s.Sub(root) 17 if err != nil { 18 return s 19 } 20 } 21 22 return newSubFS(f, root) 23 } 24 25 func newSubFS(f fs.FS, root string) fs.FS { 26 return subFS{ 27 root: root, 28 f: f, 29 } 30 } 31 32 func (s subFS) Open(name string) (fs.File, error) { 33 if name == "." { 34 return rootFile{ 35 s: s, 36 }, nil 37 } 38 return s.f.Open(path.Join(s.root, name)) 39 } 40 41 type rootFile struct { 42 s subFS 43 } 44 45 func (r rootFile) Name() string { 46 return "." 47 } 48 49 func (r rootFile) Size() int64 { 50 return 0 51 } 52 53 func (r rootFile) Mode() fs.FileMode { 54 return fs.ModePerm 55 } 56 57 func (r rootFile) ModTime() time.Time { 58 return time.Now() 59 } 60 61 func (r rootFile) IsDir() bool { 62 return true 63 } 64 65 func (r rootFile) Sys() any { 66 return nil 67 } 68 69 func (r rootFile) ReadDir(_ int) ([]fs.DirEntry, error) { 70 return fs.ReadDir(r.s.f, r.s.root) 71 } 72 73 func (r rootFile) Stat() (fs.FileInfo, error) { 74 return r, nil 75 } 76 77 func (r rootFile) Read(_ []byte) (int, error) { 78 panic("not implemented") 79 } 80 81 func (r rootFile) Close() error { 82 return nil 83 } 84 85 var _ fs.File = (*rootFile)(nil) 86 var _ fs.ReadDirFile = (*rootFile)(nil) 87 var _ fs.FileInfo = (*rootFile)(nil) 88 89 type subFsFileInfo struct { 90 fi fs.FileInfo 91 } 92 93 func (s subFsFileInfo) Name() string { 94 return s.fi.Name() 95 } 96 97 func (s subFsFileInfo) Size() int64 { 98 return s.fi.Size() 99 } 100 101 func (s subFsFileInfo) Mode() fs.FileMode { 102 return s.fi.Mode() 103 } 104 105 func (s subFsFileInfo) ModTime() time.Time { 106 return s.fi.ModTime() 107 } 108 109 func (s subFsFileInfo) IsDir() bool { 110 return s.fi.IsDir() 111 } 112 113 func (s subFsFileInfo) Sys() any { 114 return s.fi.Sys() 115 } 116 117 var _ fs.FileInfo = (*subFsFileInfo)(nil)