in src/scip-lib/scanner/scan.go [97:152]
func (is *IndexScannerImpl) ScanIndexReader(r ScipReader) error {
if is.Pool == nil {
is.InitBuffers()
}
document := scip.Document{}
for {
fieldNumber, fieldType, err := is.consumeBytesFieldMeta(r)
if err == io.EOF {
return nil
}
if err != nil {
return errors.Join(fmt.Errorf("failed to consume field"), err)
}
if fieldNumber != indexDocumentsFieldNumber {
err := is.skipField(r)
if err != nil {
return errors.Join(fmt.Errorf("failed to skip %q", indexFieldName(fieldNumber)), err)
}
continue
}
dataLen, err := is.consumeLen(r, fieldType)
if err != nil {
return errors.Join(fmt.Errorf("failed to consume length"), err)
}
dataBuf := is.Pool.Get(dataLen)
err = is.consumeFieldData(r, dataLen, dataBuf)
if err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to consume %q data", indexFieldName(fieldNumber)), err)
}
switch fieldNumber {
case indexDocumentsFieldNumber:
docPath, err := is.parseDocumentPath(dataBuf)
if err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to parse document path"), err)
}
// Unmarshall the doc when all conditions match
if is.MatchDocumentPath != nil && is.MatchDocumentPath(docPath) && is.VisitDocument != nil {
if err := proto.Unmarshal(dataBuf, &document); err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to read document"), err)
}
is.VisitDocument(&document)
}
// Individually scna through the document to parse symbols/occurrences
docReader := bytes.NewReader(dataBuf)
if err := is.ScanDocumentReader(docPath, docReader); err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to scan document"), err)
}
}
is.Pool.Put(dataBuf)
}
}