diff --git a/cmd/packages.go b/cmd/packages.go index 4078b66c7..2c7856072 100644 --- a/cmd/packages.go +++ b/cmd/packages.go @@ -6,6 +6,8 @@ import ( "io/ioutil" "os" + "github.com/anchore/syft/syft/format" + "github.com/anchore/stereoscope" "github.com/anchore/syft/internal" "github.com/anchore/syft/internal/anchore" @@ -48,7 +50,7 @@ const ( ) var ( - packagesPresenterOpt packages.PresenterOption + packagesPresenterOpt format.Option packagesArgs = cobra.MaximumNArgs(1) packagesCmd = &cobra.Command{ Use: "packages [SOURCE]", @@ -71,8 +73,8 @@ var ( } // set the presenter - presenterOption := packages.ParsePresenterOption(appConfig.Output) - if presenterOption == packages.UnknownPresenterOption { + presenterOption := format.ParseOption(appConfig.Output) + if presenterOption == format.UnknownOption { return fmt.Errorf("bad --output value '%s'", appConfig.Output) } packagesPresenterOpt = presenterOption @@ -109,8 +111,8 @@ func setPackageFlags(flags *pflag.FlagSet) { fmt.Sprintf("selection of layers to catalog, options=%v", source.AllScopes)) flags.StringP( - "output", "o", string(packages.TablePresenterOption), - fmt.Sprintf("report output formatter, options=%v", packages.AllPresenters), + "output", "o", string(format.TableOption), + fmt.Sprintf("report output formatter, options=%v", format.AllOptions), ) flags.StringP( @@ -247,7 +249,7 @@ func packagesExecWorker(userInput string) <-chan error { bus.Publish(partybus.Event{ Type: event.PresenterReady, - Value: packages.Presenter(packagesPresenterOpt, packages.PresenterConfig{ + Value: packages.Presenter(packagesPresenterOpt, packages.Config{ SourceMetadata: src.Metadata, Catalog: catalog, Distro: d, diff --git a/syft/presenter/packages/presenter_config.go b/syft/presenter/packages/config.go similarity index 89% rename from syft/presenter/packages/presenter_config.go rename to syft/presenter/packages/config.go index d318e4288..8c988d1e8 100644 --- a/syft/presenter/packages/presenter_config.go +++ b/syft/presenter/packages/config.go @@ -6,7 +6,7 @@ import ( "github.com/anchore/syft/syft/source" ) -type PresenterConfig struct { +type Config struct { SourceMetadata source.Metadata Catalog *pkg.Catalog Distro *distro.Distro diff --git a/syft/presenter/packages/presenter.go b/syft/presenter/packages/presenter.go index 6d0d594ef..d26f727fc 100644 --- a/syft/presenter/packages/presenter.go +++ b/syft/presenter/packages/presenter.go @@ -5,26 +5,30 @@ a specific Presenter implementation given user configuration. package packages import ( + "github.com/anchore/syft/internal/formats" "github.com/anchore/syft/internal/presenter/packages" + "github.com/anchore/syft/syft/format" "github.com/anchore/syft/syft/presenter" ) // Presenter returns a presenter for images or directories -func Presenter(option PresenterOption, config PresenterConfig) presenter.Presenter { - switch option { - case JSONPresenterOption: - return packages.NewJSONPresenter(config.Catalog, config.SourceMetadata, config.Distro, config.Scope) - case TextPresenterOption: +func Presenter(o format.Option, config Config) presenter.Presenter { + // TODO: This function will be removed in the future + switch o { + case format.TextOption: return packages.NewTextPresenter(config.Catalog, config.SourceMetadata) - case TablePresenterOption: + case format.TableOption: return packages.NewTablePresenter(config.Catalog) - case CycloneDxPresenterOption: + case format.CycloneDxOption: return packages.NewCycloneDxPresenter(config.Catalog, config.SourceMetadata) - case SPDXTagValuePresenterOption: + case format.SPDXTagValueOption: return packages.NewSPDXTagValuePresenter(config.Catalog, config.SourceMetadata) - case SPDXJSONPresenterOption: - return packages.NewSPDXJSONPresenter(config.Catalog, config.SourceMetadata) default: - return nil + // TODO: this is the new way of getting presenters from formats + f := formats.ByOption(o) + if f == nil { + return nil + } + return f.Presenter(config.Catalog, &config.SourceMetadata, config.Distro) } } diff --git a/syft/presenter/packages/presenter_option.go b/syft/presenter/packages/presenter_option.go deleted file mode 100644 index 7bdcbc075..000000000 --- a/syft/presenter/packages/presenter_option.go +++ /dev/null @@ -1,43 +0,0 @@ -package packages - -import "strings" - -const ( - UnknownPresenterOption PresenterOption = "UnknownPresenterOption" - JSONPresenterOption PresenterOption = "json" - TextPresenterOption PresenterOption = "text" - TablePresenterOption PresenterOption = "table" - CycloneDxPresenterOption PresenterOption = "cyclonedx" - SPDXTagValuePresenterOption PresenterOption = "spdx-tag-value" - SPDXJSONPresenterOption PresenterOption = "spdx-json" -) - -var AllPresenters = []PresenterOption{ - JSONPresenterOption, - TextPresenterOption, - TablePresenterOption, - CycloneDxPresenterOption, - SPDXTagValuePresenterOption, - SPDXJSONPresenterOption, -} - -type PresenterOption string - -func ParsePresenterOption(userStr string) PresenterOption { - switch strings.ToLower(userStr) { - case string(JSONPresenterOption): - return JSONPresenterOption - case string(TextPresenterOption): - return TextPresenterOption - case string(TablePresenterOption): - return TablePresenterOption - case string(CycloneDxPresenterOption), "cyclone", "cyclone-dx": - return CycloneDxPresenterOption - case string(SPDXTagValuePresenterOption), "spdx", "spdx-tagvalue", "spdxtagvalue", "spdx-tv": - return SPDXTagValuePresenterOption - case string(SPDXJSONPresenterOption), "spdxjson": - return SPDXJSONPresenterOption - default: - return UnknownPresenterOption - } -} diff --git a/syft/presenter/presenter.go b/syft/presenter/presenter.go index 823a2e38d..45710e1f4 100644 --- a/syft/presenter/presenter.go +++ b/syft/presenter/presenter.go @@ -1,6 +1,8 @@ package presenter -import "io" +import ( + "io" +) // Presenter defines the expected behavior for an object responsible for displaying arbitrary input and processed data // to a given io.Writer.