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