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