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  }