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