github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/cataloger/golang/billy_adapter.go (about)

     1  package golang
     2  
     3  import (
     4  	"io/fs"
     5  	"os"
     6  
     7  	"github.com/go-git/go-billy/v5"
     8  )
     9  
    10  // billyFSAdapter is a fs.FS, fs.ReadDirFS, and fs.StatFS wrapping what billyfs returns
    11  type billyFSAdapter struct {
    12  	fs billy.Filesystem
    13  }
    14  
    15  func (b billyFSAdapter) Stat(name string) (fs.FileInfo, error) {
    16  	return b.fs.Stat(name)
    17  }
    18  
    19  func (b billyFSAdapter) ReadDir(name string) (out []fs.DirEntry, _ error) {
    20  	entries, err := b.fs.ReadDir(name)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	for _, e := range entries {
    25  		out = append(out, billyDirEntry{fi: e})
    26  	}
    27  	return
    28  }
    29  
    30  func (b billyFSAdapter) Open(name string) (fs.File, error) {
    31  	f, err := b.fs.Open(name)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	fi, err := b.Stat(name)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	return billyFile{f: f, fi: fi}, nil
    40  }
    41  
    42  var _ fs.FS = (*billyFSAdapter)(nil)
    43  var _ fs.ReadDirFS = (*billyFSAdapter)(nil)
    44  var _ fs.StatFS = (*billyFSAdapter)(nil)
    45  
    46  // billyFile is a fs.File wrapping what billyfs returns
    47  type billyFile struct {
    48  	f  billy.File
    49  	fi fs.FileInfo
    50  }
    51  
    52  func (b billyFile) Stat() (fs.FileInfo, error) {
    53  	return b.fi, nil
    54  }
    55  
    56  func (b billyFile) Read(i []byte) (int, error) {
    57  	return b.f.Read(i)
    58  }
    59  
    60  func (b billyFile) Close() error {
    61  	return b.f.Close()
    62  }
    63  
    64  var _ fs.File = (*billyFile)(nil)
    65  
    66  // billyDirEntry is a fs.DirEntry wrapping what billyfs returns
    67  type billyDirEntry struct {
    68  	fi os.FileInfo
    69  }
    70  
    71  func (b billyDirEntry) Name() string {
    72  	return b.fi.Name()
    73  }
    74  
    75  func (b billyDirEntry) IsDir() bool {
    76  	return b.fi.IsDir()
    77  }
    78  
    79  func (b billyDirEntry) Type() fs.FileMode {
    80  	return b.fi.Mode()
    81  }
    82  
    83  func (b billyDirEntry) Info() (fs.FileInfo, error) {
    84  	return b.fi, nil
    85  }
    86  
    87  var _ fs.DirEntry = (*billyDirEntry)(nil)