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