github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/internal/fileresolver/deferred.go (about)

     1  package fileresolver
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/nextlinux/gosbom/gosbom/file"
     7  	"github.com/nextlinux/gosbom/internal/log"
     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  }