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 Li// Creator is a wrapper around the Creator SPDX field. The SPDX field contains two values, which requires special 12*ba677afaSXin Li// handling in order to marshal/unmarshal it to/from Go data types. 13*ba677afaSXin Litype Creator struct { 14*ba677afaSXin Li Creator string 15*ba677afaSXin Li // CreatorType should be one of "Person", "Organization", or "Tool" 16*ba677afaSXin Li CreatorType string 17*ba677afaSXin Li} 18*ba677afaSXin Li 19*ba677afaSXin Li// UnmarshalJSON takes an annotator in the typical one-line format and parses it into a Creator struct. 20*ba677afaSXin Li// This function is also used when unmarshalling YAML 21*ba677afaSXin Lifunc (c *Creator) UnmarshalJSON(data []byte) error { 22*ba677afaSXin Li str := string(data) 23*ba677afaSXin Li str = strings.Trim(str, "\"") 24*ba677afaSXin Li fields := strings.SplitN(str, ": ", 2) 25*ba677afaSXin Li 26*ba677afaSXin Li if len(fields) != 2 { 27*ba677afaSXin Li return fmt.Errorf("failed to parse Creator '%s'", str) 28*ba677afaSXin Li } 29*ba677afaSXin Li 30*ba677afaSXin Li c.CreatorType = fields[0] 31*ba677afaSXin Li c.Creator = fields[1] 32*ba677afaSXin Li 33*ba677afaSXin Li return nil 34*ba677afaSXin Li} 35*ba677afaSXin Li 36*ba677afaSXin Li// MarshalJSON converts the receiver into a slice of bytes representing a Creator in string form. 37*ba677afaSXin Li// This function is also used with marshalling to YAML 38*ba677afaSXin Lifunc (c Creator) MarshalJSON() ([]byte, error) { 39*ba677afaSXin Li if c.Creator != "" { 40*ba677afaSXin Li return json.Marshal(fmt.Sprintf("%s: %s", c.CreatorType, c.Creator)) 41*ba677afaSXin Li } 42*ba677afaSXin Li 43*ba677afaSXin Li return []byte{}, nil 44*ba677afaSXin Li} 45