@@ -19,21 +19,49 @@ import (
1919 "github.com/aquasecurity/trivy/pkg/types"
2020)
2121
22+ type EncoderOption func (* Encoder )
23+
24+ // WithBOMRef enables BOM-Ref generation for CycloneDX components
25+ func WithBOMRef () EncoderOption {
26+ return func (e * Encoder ) {
27+ e .bomOpts .GenerateBOMRef = true
28+ }
29+ }
30+
31+ // WithParents enables holding parent maps in the BOM structure
32+ func WithParents () EncoderOption {
33+ return func (e * Encoder ) {
34+ e .bomOpts .Parents = true
35+ }
36+ }
37+
38+ // ForceRegenerate forces regeneration of BOM instead of reusing existing one
39+ func ForceRegenerate () EncoderOption {
40+ return func (e * Encoder ) {
41+ e .forceRegenerate = true
42+ }
43+ }
44+
2245type Encoder struct {
23- bom * core.BOM
24- opts core.Options
46+ bom * core.BOM
47+ bomOpts core.Options
48+ forceRegenerate bool
2549}
2650
27- func NewEncoder (opts core.Options ) * Encoder {
28- return & Encoder {opts : opts }
51+ func NewEncoder (opts ... EncoderOption ) * Encoder {
52+ e := & Encoder {}
53+ for _ , opt := range opts {
54+ opt (e )
55+ }
56+ return e
2957}
3058
3159func (e * Encoder ) Encode (report types.Report ) (* core.BOM , error ) {
32- // When report.BOM is not nil, reuse the existing BOM structure.
60+ // When report.BOM is not nil, reuse the existing BOM structure unless ForceRegenerate is set .
3361 // This happens in two scenarios:
3462 // 1. SBOM scanning: When scanning an existing SBOM file to refresh vulnerabilities
3563 // 2. Library usage: When using Trivy as a library with a custom BOM in the report
36- if report .BOM != nil {
64+ if report .BOM != nil && ! e . forceRegenerate {
3765 return e .reuseExistingBOM (report )
3866 }
3967 // Metadata component
@@ -42,7 +70,7 @@ func (e *Encoder) Encode(report types.Report) (*core.BOM, error) {
4270 return nil , xerrors .Errorf ("failed to create root component: %w" , err )
4371 }
4472
45- e .bom = core .NewBOM (e .opts )
73+ e .bom = core .NewBOM (e .bomOpts )
4674 if report .BOM != nil {
4775 e .bom .SerialNumber = report .BOM .SerialNumber
4876 e .bom .Version = report .BOM .Version
0 commit comments