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)