106 lines
3.2 KiB
Go
106 lines
3.2 KiB
Go
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
|
|
package common
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Supplier struct {
|
|
// can be "NOASSERTION"
|
|
Supplier string
|
|
// SupplierType can be one of "Person", "Organization", or empty if Supplier is "NOASSERTION"
|
|
SupplierType string
|
|
}
|
|
|
|
// UnmarshalJSON takes a supplier in the typical one-line format and parses it into a Supplier struct.
|
|
// This function is also used when unmarshalling YAML
|
|
func (s *Supplier) UnmarshalJSON(data []byte) error {
|
|
// the value is just a string presented as a slice of bytes
|
|
supplierStr := string(data)
|
|
supplierStr = strings.Trim(supplierStr, "\"")
|
|
|
|
if supplierStr == "NOASSERTION" {
|
|
s.Supplier = supplierStr
|
|
return nil
|
|
}
|
|
|
|
supplierFields := strings.SplitN(supplierStr, ": ", 2)
|
|
|
|
if len(supplierFields) != 2 {
|
|
return fmt.Errorf("failed to parse Supplier '%s'", supplierStr)
|
|
}
|
|
|
|
s.SupplierType = supplierFields[0]
|
|
s.Supplier = supplierFields[1]
|
|
|
|
return nil
|
|
}
|
|
|
|
// MarshalJSON converts the receiver into a slice of bytes representing a Supplier in string form.
|
|
// This function is also used when marshalling to YAML
|
|
func (s Supplier) MarshalJSON() ([]byte, error) {
|
|
if s.Supplier == "NOASSERTION" {
|
|
return json.Marshal(s.Supplier)
|
|
} else if s.SupplierType != "" && s.Supplier != "" {
|
|
return json.Marshal(fmt.Sprintf("%s: %s", s.SupplierType, s.Supplier))
|
|
}
|
|
|
|
return []byte{}, fmt.Errorf("failed to marshal invalid Supplier: %+v", s)
|
|
}
|
|
|
|
type Originator struct {
|
|
// can be "NOASSERTION"
|
|
Originator string
|
|
// OriginatorType can be one of "Person", "Organization", or empty if Originator is "NOASSERTION"
|
|
OriginatorType string
|
|
}
|
|
|
|
// UnmarshalJSON takes an originator in the typical one-line format and parses it into an Originator struct.
|
|
// This function is also used when unmarshalling YAML
|
|
func (o *Originator) UnmarshalJSON(data []byte) error {
|
|
// the value is just a string presented as a slice of bytes
|
|
originatorStr := string(data)
|
|
originatorStr = strings.Trim(originatorStr, "\"")
|
|
|
|
if originatorStr == "NOASSERTION" {
|
|
o.Originator = originatorStr
|
|
return nil
|
|
}
|
|
|
|
originatorFields := strings.SplitN(originatorStr, ": ", 2)
|
|
|
|
if len(originatorFields) != 2 {
|
|
return fmt.Errorf("failed to parse Originator '%s'", originatorStr)
|
|
}
|
|
|
|
o.OriginatorType = originatorFields[0]
|
|
o.Originator = originatorFields[1]
|
|
|
|
return nil
|
|
}
|
|
|
|
// MarshalJSON converts the receiver into a slice of bytes representing an Originator in string form.
|
|
// This function is also used when marshalling to YAML
|
|
func (o Originator) MarshalJSON() ([]byte, error) {
|
|
if o.Originator == "NOASSERTION" {
|
|
return json.Marshal(o.Originator)
|
|
} else if o.Originator != "" {
|
|
return json.Marshal(fmt.Sprintf("%s: %s", o.OriginatorType, o.Originator))
|
|
}
|
|
|
|
return []byte{}, nil
|
|
}
|
|
|
|
type PackageVerificationCode struct {
|
|
// Cardinality: mandatory, one if filesAnalyzed is true / omitted;
|
|
// zero (must be omitted) if filesAnalyzed is false
|
|
Value string `json:"packageVerificationCodeValue"`
|
|
// Spec also allows specifying files to exclude from the
|
|
// verification code algorithm; intended to enable exclusion of
|
|
// the SPDX document file itself.
|
|
ExcludedFiles []string `json:"packageVerificationCodeExcludedFiles,omitempty"`
|
|
}
|