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