github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/internal/fileresolver/deferred.go (about) 1 package fileresolver 2 3 import ( 4 "io" 5 6 "github.com/anchore/syft/internal/log" 7 "github.com/anchore/syft/syft/file" 8 ) 9 10 var _ file.Resolver = (*Deferred)(nil) 11 12 func NewDeferred(creator func() (file.Resolver, error)) *Deferred { 13 return &Deferred{ 14 creator: creator, 15 } 16 } 17 18 type Deferred struct { 19 creator func() (file.Resolver, error) 20 resolver file.Resolver 21 } 22 23 func (d *Deferred) getResolver() (file.Resolver, error) { 24 if d.resolver == nil { 25 resolver, err := d.creator() 26 if err != nil { 27 return nil, err 28 } 29 d.resolver = resolver 30 } 31 return d.resolver, nil 32 } 33 34 func (d *Deferred) FileContentsByLocation(location file.Location) (io.ReadCloser, error) { 35 r, err := d.getResolver() 36 if err != nil { 37 return nil, err 38 } 39 return r.FileContentsByLocation(location) 40 } 41 42 func (d *Deferred) HasPath(s string) bool { 43 r, err := d.getResolver() 44 if err != nil { 45 log.Debug("unable to get resolver: %v", err) 46 return false 47 } 48 return r.HasPath(s) 49 } 50 51 func (d *Deferred) FilesByPath(paths ...string) ([]file.Location, error) { 52 r, err := d.getResolver() 53 if err != nil { 54 return nil, err 55 } 56 return r.FilesByPath(paths...) 57 } 58 59 func (d *Deferred) FilesByGlob(patterns ...string) ([]file.Location, error) { 60 r, err := d.getResolver() 61 if err != nil { 62 return nil, err 63 } 64 return r.FilesByGlob(patterns...) 65 } 66 67 func (d *Deferred) FilesByMIMEType(types ...string) ([]file.Location, error) { 68 r, err := d.getResolver() 69 if err != nil { 70 return nil, err 71 } 72 return r.FilesByMIMEType(types...) 73 } 74 75 func (d *Deferred) RelativeFileByPath(location file.Location, path string) *file.Location { 76 r, err := d.getResolver() 77 if err != nil { 78 return nil 79 } 80 return r.RelativeFileByPath(location, path) 81 } 82 83 func (d *Deferred) AllLocations() <-chan file.Location { 84 r, err := d.getResolver() 85 if err != nil { 86 log.Debug("unable to get resolver: %v", err) 87 return nil 88 } 89 return r.AllLocations() 90 } 91 92 func (d *Deferred) FileMetadataByLocation(location file.Location) (file.Metadata, error) { 93 r, err := d.getResolver() 94 if err != nil { 95 return file.Metadata{}, err 96 } 97 return r.FileMetadataByLocation(location) 98 }