github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/syft/format/spdxtagvalue/encoder.go (about) 1 package spdxtagvalue 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/spdx/tools-golang/convert" 8 "github.com/spdx/tools-golang/spdx/v2/v2_1" 9 "github.com/spdx/tools-golang/spdx/v2/v2_2" 10 "github.com/spdx/tools-golang/spdx/v2/v2_3" 11 "github.com/spdx/tools-golang/tagvalue" 12 13 "github.com/anchore/syft/syft/format/common/spdxhelpers" 14 "github.com/anchore/syft/syft/sbom" 15 "github.com/lineaje-labs/syft/syft/format/internal/spdxutil" 16 ) 17 18 const ID = spdxutil.TagValueFormatID 19 20 func SupportedVersions() []string { 21 return spdxutil.SupportedVersions(ID) 22 } 23 24 type EncoderConfig struct { 25 Version string 26 } 27 28 type encoder struct { 29 cfg EncoderConfig 30 } 31 32 func NewFormatEncoderWithConfig(cfg EncoderConfig) (sbom.FormatEncoder, error) { 33 return encoder{ 34 cfg: cfg, 35 }, nil 36 } 37 38 func DefaultEncoderConfig() EncoderConfig { 39 return EncoderConfig{ 40 Version: spdxutil.DefaultVersion, 41 } 42 } 43 44 func (e encoder) ID() sbom.FormatID { 45 return ID 46 } 47 48 func (e encoder) Aliases() []string { 49 return []string{ 50 "spdx", 51 "spdx-tv", 52 } 53 } 54 55 func (e encoder) Version() string { 56 return e.cfg.Version 57 } 58 59 func (e encoder) Encode(writer io.Writer, s sbom.SBOM) error { 60 latestDoc := spdxhelpers.ToFormatModel(s) 61 if latestDoc == nil { 62 return fmt.Errorf("unable to convert SBOM to SPDX document") 63 } 64 65 var err error 66 var encodeDoc any 67 switch e.cfg.Version { 68 case "2.1": 69 doc := v2_1.Document{} 70 err = convert.Document(latestDoc, &doc) 71 encodeDoc = doc 72 case "2.2": 73 doc := v2_2.Document{} 74 err = convert.Document(latestDoc, &doc) 75 encodeDoc = doc 76 77 case "2.3", "", "2", "2.x": 78 doc := v2_3.Document{} 79 err = convert.Document(latestDoc, &doc) 80 encodeDoc = doc 81 default: 82 return fmt.Errorf("unsupported SPDX version %q", e.cfg.Version) 83 } 84 85 if err != nil { 86 return fmt.Errorf("unable to convert SBOM to SPDX document: %w", err) 87 } 88 89 return tagvalue.Write(encodeDoc, writer) 90 }