github.com/anchore/syft@v1.38.2/syft/source/sourceproviders/source_providers.go (about)

     1  package sourceproviders
     2  
     3  import (
     4  	"github.com/anchore/go-collections"
     5  	"github.com/anchore/stereoscope"
     6  	"github.com/anchore/stereoscope/pkg/image"
     7  	"github.com/anchore/syft/syft/source"
     8  	"github.com/anchore/syft/syft/source/directorysource"
     9  	"github.com/anchore/syft/syft/source/filesource"
    10  	"github.com/anchore/syft/syft/source/snapsource"
    11  	"github.com/anchore/syft/syft/source/stereoscopesource"
    12  )
    13  
    14  const (
    15  	FileTag = stereoscope.FileTag
    16  	DirTag  = stereoscope.DirTag
    17  	PullTag = stereoscope.PullTag
    18  	SnapTag = "snap"
    19  )
    20  
    21  // All returns all the configured source providers known to syft
    22  func All(userInput string, cfg *Config) []collections.TaggedValue[source.Provider] {
    23  	if cfg == nil {
    24  		cfg = DefaultConfig()
    25  	}
    26  	stereoscopeProviders := stereoscopeSourceProviders(userInput, cfg)
    27  
    28  	return collections.TaggedValueSet[source.Provider]{}.
    29  		// 1. try all specific, local sources first...
    30  
    31  		// --from file, dir, oci-archive, etc.
    32  		Join(stereoscopeProviders.Select(FileTag, DirTag)...).
    33  
    34  		// --from snap (local only)
    35  		Join(tagProvider(snapsource.NewLocalSourceProvider(userInput, cfg.Exclude, cfg.DigestAlgorithms, cfg.Alias), SnapTag)).
    36  
    37  		// 2. try unspecific, local sources after other local sources last...
    38  		Join(tagProvider(filesource.NewSourceProvider(userInput, cfg.Exclude, cfg.DigestAlgorithms, cfg.Alias), FileTag)).
    39  		Join(tagProvider(directorysource.NewSourceProvider(userInput, cfg.Exclude, cfg.Alias, cfg.BasePath), DirTag)).
    40  
    41  		// 3. try remote sources after everything else...
    42  
    43  		// --from docker, registry, etc.
    44  		Join(stereoscopeProviders.Select(PullTag)...).
    45  
    46  		// --from snap (remote only)
    47  		Join(tagProvider(snapsource.NewRemoteSourceProvider(userInput, cfg.Exclude, cfg.DigestAlgorithms, cfg.Alias), SnapTag))
    48  }
    49  
    50  func stereoscopeSourceProviders(userInput string, cfg *Config) collections.TaggedValueSet[source.Provider] {
    51  	var registry image.RegistryOptions
    52  	if cfg.RegistryOptions != nil {
    53  		registry = *cfg.RegistryOptions
    54  	}
    55  	stereoscopeProviders := stereoscopesource.Providers(stereoscopesource.ProviderConfig{
    56  		StereoscopeImageProviderConfig: stereoscope.ImageProviderConfig{
    57  			UserInput: userInput,
    58  			Platform:  cfg.Platform,
    59  			Registry:  registry,
    60  		},
    61  		Alias:   cfg.Alias,
    62  		Exclude: cfg.Exclude,
    63  	})
    64  	return stereoscopeProviders
    65  }
    66  
    67  func tagProvider(provider source.Provider, tags ...string) collections.TaggedValue[source.Provider] {
    68  	return collections.NewTaggedValue(provider, append([]string{provider.Name()}, tags...)...)
    69  }