xref: /aosp_15_r20/external/spdx-tools/spdx/common/package.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage common
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"encoding/json"
7*ba677afaSXin Li	"fmt"
8*ba677afaSXin Li	"strings"
9*ba677afaSXin Li)
10*ba677afaSXin Li
11*ba677afaSXin Litype Supplier struct {
12*ba677afaSXin Li	// can be "NOASSERTION"
13*ba677afaSXin Li	Supplier string
14*ba677afaSXin Li	// SupplierType can be one of "Person", "Organization", or empty if Supplier is "NOASSERTION"
15*ba677afaSXin Li	SupplierType string
16*ba677afaSXin Li}
17*ba677afaSXin Li
18*ba677afaSXin Li// UnmarshalJSON takes a supplier in the typical one-line format and parses it into a Supplier struct.
19*ba677afaSXin Li// This function is also used when unmarshalling YAML
20*ba677afaSXin Lifunc (s *Supplier) UnmarshalJSON(data []byte) error {
21*ba677afaSXin Li	// the value is just a string presented as a slice of bytes
22*ba677afaSXin Li	supplierStr := string(data)
23*ba677afaSXin Li	supplierStr = strings.Trim(supplierStr, "\"")
24*ba677afaSXin Li
25*ba677afaSXin Li	if supplierStr == "NOASSERTION" {
26*ba677afaSXin Li		s.Supplier = supplierStr
27*ba677afaSXin Li		return nil
28*ba677afaSXin Li	}
29*ba677afaSXin Li
30*ba677afaSXin Li	supplierFields := strings.SplitN(supplierStr, ": ", 2)
31*ba677afaSXin Li
32*ba677afaSXin Li	if len(supplierFields) != 2 {
33*ba677afaSXin Li		return fmt.Errorf("failed to parse Supplier '%s'", supplierStr)
34*ba677afaSXin Li	}
35*ba677afaSXin Li
36*ba677afaSXin Li	s.SupplierType = supplierFields[0]
37*ba677afaSXin Li	s.Supplier = supplierFields[1]
38*ba677afaSXin Li
39*ba677afaSXin Li	return nil
40*ba677afaSXin Li}
41*ba677afaSXin Li
42*ba677afaSXin Li// MarshalJSON converts the receiver into a slice of bytes representing a Supplier in string form.
43*ba677afaSXin Li// This function is also used when marshalling to YAML
44*ba677afaSXin Lifunc (s Supplier) MarshalJSON() ([]byte, error) {
45*ba677afaSXin Li	if s.Supplier == "NOASSERTION" {
46*ba677afaSXin Li		return json.Marshal(s.Supplier)
47*ba677afaSXin Li	} else if s.SupplierType != "" && s.Supplier != "" {
48*ba677afaSXin Li		return json.Marshal(fmt.Sprintf("%s: %s", s.SupplierType, s.Supplier))
49*ba677afaSXin Li	}
50*ba677afaSXin Li
51*ba677afaSXin Li	return []byte{}, fmt.Errorf("failed to marshal invalid Supplier: %+v", s)
52*ba677afaSXin Li}
53*ba677afaSXin Li
54*ba677afaSXin Litype Originator struct {
55*ba677afaSXin Li	// can be "NOASSERTION"
56*ba677afaSXin Li	Originator string
57*ba677afaSXin Li	// OriginatorType can be one of "Person", "Organization", or empty if Originator is "NOASSERTION"
58*ba677afaSXin Li	OriginatorType string
59*ba677afaSXin Li}
60*ba677afaSXin Li
61*ba677afaSXin Li// UnmarshalJSON takes an originator in the typical one-line format and parses it into an Originator struct.
62*ba677afaSXin Li// This function is also used when unmarshalling YAML
63*ba677afaSXin Lifunc (o *Originator) UnmarshalJSON(data []byte) error {
64*ba677afaSXin Li	// the value is just a string presented as a slice of bytes
65*ba677afaSXin Li	originatorStr := string(data)
66*ba677afaSXin Li	originatorStr = strings.Trim(originatorStr, "\"")
67*ba677afaSXin Li
68*ba677afaSXin Li	if originatorStr == "NOASSERTION" {
69*ba677afaSXin Li		o.Originator = originatorStr
70*ba677afaSXin Li		return nil
71*ba677afaSXin Li	}
72*ba677afaSXin Li
73*ba677afaSXin Li	originatorFields := strings.SplitN(originatorStr, ": ", 2)
74*ba677afaSXin Li
75*ba677afaSXin Li	if len(originatorFields) != 2 {
76*ba677afaSXin Li		return fmt.Errorf("failed to parse Originator '%s'", originatorStr)
77*ba677afaSXin Li	}
78*ba677afaSXin Li
79*ba677afaSXin Li	o.OriginatorType = originatorFields[0]
80*ba677afaSXin Li	o.Originator = originatorFields[1]
81*ba677afaSXin Li
82*ba677afaSXin Li	return nil
83*ba677afaSXin Li}
84*ba677afaSXin Li
85*ba677afaSXin Li// MarshalJSON converts the receiver into a slice of bytes representing an Originator in string form.
86*ba677afaSXin Li// This function is also used when marshalling to YAML
87*ba677afaSXin Lifunc (o Originator) MarshalJSON() ([]byte, error) {
88*ba677afaSXin Li	if o.Originator == "NOASSERTION" {
89*ba677afaSXin Li		return json.Marshal(o.Originator)
90*ba677afaSXin Li	} else if o.Originator != "" {
91*ba677afaSXin Li		return json.Marshal(fmt.Sprintf("%s: %s", o.OriginatorType, o.Originator))
92*ba677afaSXin Li	}
93*ba677afaSXin Li
94*ba677afaSXin Li	return []byte{}, nil
95*ba677afaSXin Li}
96*ba677afaSXin Li
97*ba677afaSXin Litype PackageVerificationCode struct {
98*ba677afaSXin Li	// Cardinality: mandatory, one if filesAnalyzed is true / omitted;
99*ba677afaSXin Li	//              zero (must be omitted) if filesAnalyzed is false
100*ba677afaSXin Li	Value string `json:"packageVerificationCodeValue"`
101*ba677afaSXin Li	// Spec also allows specifying files to exclude from the
102*ba677afaSXin Li	// verification code algorithm; intended to enable exclusion of
103*ba677afaSXin Li	// the SPDX document file itself.
104*ba677afaSXin Li	ExcludedFiles []string `json:"packageVerificationCodeExcludedFiles,omitempty"`
105*ba677afaSXin Li}
106