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  }