/
package.go
103 lines (84 loc) · 3.19 KB
/
package.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// 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 = strings.TrimLeft(originatorFields[1], " \t")
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"`
}