mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 08:23:15 +01:00
* add new format pattern Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add syftjson format Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add internal formats helper Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add SBOM encode/decode to lib API Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * remove json presenter + update presenter tests to use common utils Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * remove presenter format enum type + add formats shim in presenter helper Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add MustCPE helper for tests Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * update usage of format enum Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add test fixtures for encode/decode tests Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * fix integration test Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * migrate format detection to use reader Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * address review comments Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package syftjson
|
|
|
|
import (
|
|
"github.com/anchore/syft/internal/formats/syftjson/model"
|
|
"github.com/anchore/syft/internal/log"
|
|
"github.com/anchore/syft/syft/distro"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
"github.com/anchore/syft/syft/source"
|
|
)
|
|
|
|
func toSyftModel(doc model.Document) (*pkg.Catalog, *source.Metadata, *distro.Distro, source.Scope, error) {
|
|
dist, err := distro.NewDistro(distro.Type(doc.Distro.Name), doc.Distro.Version, doc.Distro.IDLike)
|
|
if err != nil {
|
|
return nil, nil, nil, source.UnknownScope, err
|
|
}
|
|
|
|
srcMetadata, scope := toSyftSourceData(doc.Source)
|
|
|
|
return toSyftCatalog(doc.Artifacts), srcMetadata, &dist, scope, nil
|
|
}
|
|
|
|
func toSyftSourceData(s model.Source) (*source.Metadata, source.Scope) {
|
|
switch s.Type {
|
|
case "directory":
|
|
return &source.Metadata{
|
|
Scheme: source.DirectoryScheme,
|
|
Path: s.Target.(string),
|
|
}, source.UnknownScope
|
|
case "image":
|
|
parsedSource := s.Target.(model.ImageSource)
|
|
return &source.Metadata{
|
|
Scheme: source.ImageScheme,
|
|
ImageMetadata: parsedSource.ImageMetadata,
|
|
}, parsedSource.Scope
|
|
}
|
|
return nil, source.UnknownScope
|
|
}
|
|
|
|
func toSyftCatalog(pkgs []model.Package) *pkg.Catalog {
|
|
catalog := pkg.NewCatalog()
|
|
for _, p := range pkgs {
|
|
catalog.Add(toSyftPackage(p))
|
|
}
|
|
return catalog
|
|
}
|
|
|
|
func toSyftPackage(p model.Package) pkg.Package {
|
|
var cpes []pkg.CPE
|
|
for _, c := range p.CPEs {
|
|
value, err := pkg.NewCPE(c)
|
|
if err != nil {
|
|
log.Warnf("excluding invalid CPE %q: %v", c, err)
|
|
continue
|
|
}
|
|
|
|
cpes = append(cpes, value)
|
|
}
|
|
|
|
return pkg.Package{
|
|
ID: pkg.ID(p.ID),
|
|
Name: p.Name,
|
|
Version: p.Version,
|
|
FoundBy: p.FoundBy,
|
|
Locations: p.Locations,
|
|
Licenses: p.Licenses,
|
|
Language: p.Language,
|
|
Type: p.Type,
|
|
CPEs: cpes,
|
|
PURL: p.PURL,
|
|
MetadataType: p.MetadataType,
|
|
Metadata: p.Metadata,
|
|
}
|
|
}
|