xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v2/parse_snippet.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage parser2v2
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"fmt"
7*ba677afaSXin Li	"strconv"
8*ba677afaSXin Li
9*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Lifunc (parser *tvParser2_2) parsePairFromSnippet2_2(tag string, value string) error {
14*ba677afaSXin Li	switch tag {
15*ba677afaSXin Li	// tag for creating new snippet section
16*ba677afaSXin Li	case "SnippetSPDXID":
17*ba677afaSXin Li		// check here whether the file contained an SPDX ID or not
18*ba677afaSXin Li		if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_2 {
19*ba677afaSXin Li			return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName)
20*ba677afaSXin Li		}
21*ba677afaSXin Li		parser.snippet = &v2_2.Snippet{}
22*ba677afaSXin Li		eID, err := extractElementID(value)
23*ba677afaSXin Li		if err != nil {
24*ba677afaSXin Li			return err
25*ba677afaSXin Li		}
26*ba677afaSXin Li		// FIXME: how should we handle where not associated with current file?
27*ba677afaSXin Li		if parser.file != nil {
28*ba677afaSXin Li			if parser.file.Snippets == nil {
29*ba677afaSXin Li				parser.file.Snippets = map[common.ElementID]*v2_2.Snippet{}
30*ba677afaSXin Li			}
31*ba677afaSXin Li			parser.file.Snippets[eID] = parser.snippet
32*ba677afaSXin Li		}
33*ba677afaSXin Li		parser.snippet.SnippetSPDXIdentifier = eID
34*ba677afaSXin Li	// tag for creating new file section and going back to parsing File
35*ba677afaSXin Li	case "FileName":
36*ba677afaSXin Li		parser.st = psFile2_2
37*ba677afaSXin Li		parser.snippet = nil
38*ba677afaSXin Li		return parser.parsePairFromFile2_2(tag, value)
39*ba677afaSXin Li	// tag for creating new package section and going back to parsing Package
40*ba677afaSXin Li	case "PackageName":
41*ba677afaSXin Li		parser.st = psPackage2_2
42*ba677afaSXin Li		parser.file = nil
43*ba677afaSXin Li		parser.snippet = nil
44*ba677afaSXin Li		return parser.parsePairFromPackage2_2(tag, value)
45*ba677afaSXin Li	// tag for going on to other license section
46*ba677afaSXin Li	case "LicenseID":
47*ba677afaSXin Li		parser.st = psOtherLicense2_2
48*ba677afaSXin Li		return parser.parsePairFromOtherLicense2_2(tag, value)
49*ba677afaSXin Li	// tags for snippet data
50*ba677afaSXin Li	case "SnippetFromFileSPDXID":
51*ba677afaSXin Li		deID, err := extractDocElementID(value)
52*ba677afaSXin Li		if err != nil {
53*ba677afaSXin Li			return err
54*ba677afaSXin Li		}
55*ba677afaSXin Li		parser.snippet.SnippetFromFileSPDXIdentifier = deID.ElementRefID
56*ba677afaSXin Li	case "SnippetByteRange":
57*ba677afaSXin Li		byteStart, byteEnd, err := extractSubs(value)
58*ba677afaSXin Li		if err != nil {
59*ba677afaSXin Li			return err
60*ba677afaSXin Li		}
61*ba677afaSXin Li		bIntStart, err := strconv.Atoi(byteStart)
62*ba677afaSXin Li		if err != nil {
63*ba677afaSXin Li			return err
64*ba677afaSXin Li		}
65*ba677afaSXin Li		bIntEnd, err := strconv.Atoi(byteEnd)
66*ba677afaSXin Li		if err != nil {
67*ba677afaSXin Li			return err
68*ba677afaSXin Li		}
69*ba677afaSXin Li
70*ba677afaSXin Li		if parser.snippet.Ranges == nil {
71*ba677afaSXin Li			parser.snippet.Ranges = []common.SnippetRange{}
72*ba677afaSXin Li		}
73*ba677afaSXin Li		byteRange := common.SnippetRange{StartPointer: common.SnippetRangePointer{Offset: bIntStart}, EndPointer: common.SnippetRangePointer{Offset: bIntEnd}}
74*ba677afaSXin Li		parser.snippet.Ranges = append(parser.snippet.Ranges, byteRange)
75*ba677afaSXin Li	case "SnippetLineRange":
76*ba677afaSXin Li		lineStart, lineEnd, err := extractSubs(value)
77*ba677afaSXin Li		if err != nil {
78*ba677afaSXin Li			return err
79*ba677afaSXin Li		}
80*ba677afaSXin Li		lInttStart, err := strconv.Atoi(lineStart)
81*ba677afaSXin Li		if err != nil {
82*ba677afaSXin Li			return err
83*ba677afaSXin Li		}
84*ba677afaSXin Li		lInttEnd, err := strconv.Atoi(lineEnd)
85*ba677afaSXin Li		if err != nil {
86*ba677afaSXin Li			return err
87*ba677afaSXin Li		}
88*ba677afaSXin Li
89*ba677afaSXin Li		if parser.snippet.Ranges == nil {
90*ba677afaSXin Li			parser.snippet.Ranges = []common.SnippetRange{}
91*ba677afaSXin Li		}
92*ba677afaSXin Li		lineRange := common.SnippetRange{StartPointer: common.SnippetRangePointer{LineNumber: lInttStart}, EndPointer: common.SnippetRangePointer{LineNumber: lInttEnd}}
93*ba677afaSXin Li		parser.snippet.Ranges = append(parser.snippet.Ranges, lineRange)
94*ba677afaSXin Li	case "SnippetLicenseConcluded":
95*ba677afaSXin Li		parser.snippet.SnippetLicenseConcluded = value
96*ba677afaSXin Li	case "LicenseInfoInSnippet":
97*ba677afaSXin Li		parser.snippet.LicenseInfoInSnippet = append(parser.snippet.LicenseInfoInSnippet, value)
98*ba677afaSXin Li	case "SnippetLicenseComments":
99*ba677afaSXin Li		parser.snippet.SnippetLicenseComments = value
100*ba677afaSXin Li	case "SnippetCopyrightText":
101*ba677afaSXin Li		parser.snippet.SnippetCopyrightText = value
102*ba677afaSXin Li	case "SnippetComment":
103*ba677afaSXin Li		parser.snippet.SnippetComment = value
104*ba677afaSXin Li	case "SnippetName":
105*ba677afaSXin Li		parser.snippet.SnippetName = value
106*ba677afaSXin Li	case "SnippetAttributionText":
107*ba677afaSXin Li		parser.snippet.SnippetAttributionTexts = append(parser.snippet.SnippetAttributionTexts, value)
108*ba677afaSXin Li	// for relationship tags, pass along but don't change state
109*ba677afaSXin Li	case "Relationship":
110*ba677afaSXin Li		parser.rln = &v2_2.Relationship{}
111*ba677afaSXin Li		parser.doc.Relationships = append(parser.doc.Relationships, parser.rln)
112*ba677afaSXin Li		return parser.parsePairForRelationship2_2(tag, value)
113*ba677afaSXin Li	case "RelationshipComment":
114*ba677afaSXin Li		return parser.parsePairForRelationship2_2(tag, value)
115*ba677afaSXin Li	// for annotation tags, pass along but don't change state
116*ba677afaSXin Li	case "Annotator":
117*ba677afaSXin Li		parser.ann = &v2_2.Annotation{}
118*ba677afaSXin Li		parser.doc.Annotations = append(parser.doc.Annotations, parser.ann)
119*ba677afaSXin Li		return parser.parsePairForAnnotation2_2(tag, value)
120*ba677afaSXin Li	case "AnnotationDate":
121*ba677afaSXin Li		return parser.parsePairForAnnotation2_2(tag, value)
122*ba677afaSXin Li	case "AnnotationType":
123*ba677afaSXin Li		return parser.parsePairForAnnotation2_2(tag, value)
124*ba677afaSXin Li	case "SPDXREF":
125*ba677afaSXin Li		return parser.parsePairForAnnotation2_2(tag, value)
126*ba677afaSXin Li	case "AnnotationComment":
127*ba677afaSXin Li		return parser.parsePairForAnnotation2_2(tag, value)
128*ba677afaSXin Li	// tag for going on to review section (DEPRECATED)
129*ba677afaSXin Li	case "Reviewer":
130*ba677afaSXin Li		parser.st = psReview2_2
131*ba677afaSXin Li		return parser.parsePairFromReview2_2(tag, value)
132*ba677afaSXin Li	default:
133*ba677afaSXin Li		return fmt.Errorf("received unknown tag %v in Snippet section", tag)
134*ba677afaSXin Li	}
135*ba677afaSXin Li
136*ba677afaSXin Li	return nil
137*ba677afaSXin Li}
138