xref: /aosp_15_r20/external/spdx-tools/spdx/common/creation_info.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 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