xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v3/parse_relationship.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage parser2v3
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"fmt"
7*ba677afaSXin Li	"strings"
8*ba677afaSXin Li)
9*ba677afaSXin Li
10*ba677afaSXin Lifunc (parser *tvParser2_3) parsePairForRelationship2_3(tag string, value string) error {
11*ba677afaSXin Li	if parser.rln == nil {
12*ba677afaSXin Li		return fmt.Errorf("no relationship struct created in parser rln pointer")
13*ba677afaSXin Li	}
14*ba677afaSXin Li
15*ba677afaSXin Li	if tag == "Relationship" {
16*ba677afaSXin Li		// parse the value to see if it's a valid relationship format
17*ba677afaSXin Li		sp := strings.SplitN(value, " ", -1)
18*ba677afaSXin Li
19*ba677afaSXin Li		// filter out any purely-whitespace items
20*ba677afaSXin Li		var rp []string
21*ba677afaSXin Li		for _, v := range sp {
22*ba677afaSXin Li			v = strings.TrimSpace(v)
23*ba677afaSXin Li			if v != "" {
24*ba677afaSXin Li				rp = append(rp, v)
25*ba677afaSXin Li			}
26*ba677afaSXin Li		}
27*ba677afaSXin Li
28*ba677afaSXin Li		if len(rp) != 3 {
29*ba677afaSXin Li			return fmt.Errorf("invalid relationship format for %s", value)
30*ba677afaSXin Li		}
31*ba677afaSXin Li
32*ba677afaSXin Li		aID, err := extractDocElementID(strings.TrimSpace(rp[0]))
33*ba677afaSXin Li		if err != nil {
34*ba677afaSXin Li			return err
35*ba677afaSXin Li		}
36*ba677afaSXin Li		parser.rln.RefA = aID
37*ba677afaSXin Li		parser.rln.Relationship = strings.TrimSpace(rp[1])
38*ba677afaSXin Li		// NONE and NOASSERTION are permitted on right side
39*ba677afaSXin Li		permittedSpecial := []string{"NONE", "NOASSERTION"}
40*ba677afaSXin Li		bID, err := extractDocElementSpecial(strings.TrimSpace(rp[2]), permittedSpecial)
41*ba677afaSXin Li		if err != nil {
42*ba677afaSXin Li			return err
43*ba677afaSXin Li		}
44*ba677afaSXin Li		parser.rln.RefB = bID
45*ba677afaSXin Li		return nil
46*ba677afaSXin Li	}
47*ba677afaSXin Li
48*ba677afaSXin Li	if tag == "RelationshipComment" {
49*ba677afaSXin Li		parser.rln.RelationshipComment = value
50*ba677afaSXin Li		return nil
51*ba677afaSXin Li	}
52*ba677afaSXin Li
53*ba677afaSXin Li	return fmt.Errorf("received unknown tag %v in Relationship section", tag)
54*ba677afaSXin Li}
55