@@ -92,28 +92,24 @@ func scanSinglePath(ctx context.Context, c malcontent.Config, path string, ruleF
9292 mrs , err := yrs .Scan (fc )
9393 if err != nil {
9494 logger .Debug ("skipping" , slog .Any ("error" , err ))
95- return & malcontent. FileReport { Path : path , Error : fmt . Sprintf ( "scan: %v" , err )}, nil
95+ return nil , err
9696 }
9797
9898 fr , err := report .Generate (ctx , path , mrs , c , archiveRoot , logger , fc )
9999 if err != nil {
100- return nil , err
101- }
102-
103- if fr .Error != "" {
104- return & malcontent.FileReport {Path : path , Error : fmt .Sprintf ("generate: %v" , fr .Error )}, nil
100+ return nil , NewFileReportError (err , path , TypeGenerateError )
105101 }
106102
107103 // Clean up the path if scanning an archive
108104 var clean string
109105 if isArchive {
110106 pathAbs , err := filepath .Abs (path )
111107 if err != nil {
112- return nil , err
108+ return nil , NewFileReportError ( err , path , TypeGenerateError )
113109 }
114110 archiveRootAbs , err := filepath .Abs (archiveRoot )
115111 if err != nil {
116- return nil , err
112+ return nil , NewFileReportError ( err , path , TypeGenerateError )
117113 }
118114 fr .ArchiveRoot = archiveRootAbs
119115 fr .FullPath = pathAbs
@@ -168,9 +164,6 @@ func exitIfHitOrMiss(frs *sync.Map, scanPath string, errIfHit bool, errIfMiss bo
168164 if fr .Skipped != "" {
169165 return true
170166 }
171- if fr .Error != "" {
172- return true
173- }
174167 filesScanned ++
175168 if len (fr .Behaviors ) > 0 && match == nil {
176169 match = fr
@@ -446,7 +439,7 @@ func handleSingleFile(ctx context.Context, path string, scanInfo scanPathInfo, c
446439 }
447440
448441 fr , err := processFile (ctx , c , c .RuleFS , path , scanInfo .effectivePath , trimPath , logger )
449- if err != nil && c .Renderer . Name () != interactive {
442+ if err != nil && ( c .Renderer == nil || c . Renderer . Name () != interactive ) {
450443 if len (c .TrimPrefixes ) > 0 {
451444 path = report .TrimPrefixes (path , c .TrimPrefixes )
452445 }
@@ -569,26 +562,42 @@ func processArchive(ctx context.Context, c malcontent.Config, rfs []fs.FS, archi
569562 return & frs , nil
570563}
571564
565+ // handleFileReportError returns the appropriate FileReport and error depending on the type of error.
566+ func handleFileReportError (err error , path string , logger * clog.Logger ) (* malcontent.FileReport , error ) {
567+ var fileErr * FileReportError
568+ if ! errors .As (err , & fileErr ) {
569+ return nil , fmt .Errorf ("failed to handle error for path %s: error type not FileReportError: %w" , path , err )
570+ }
571+
572+ switch fileErr .Type () {
573+ case TypeUnknown :
574+ return nil , fmt .Errorf ("unknown error occurred while scanning path %s: %w" , path , err )
575+ case TypeScanError :
576+ logger .Errorf ("scan path: %v" , err )
577+ return nil , fmt .Errorf ("scan failed for path %s: %w" , path , err )
578+ case TypeGenerateError :
579+ return & malcontent.FileReport {
580+ Path : path ,
581+ Skipped : errMsgGenerateFailed ,
582+ }, nil
583+ default :
584+ return nil , fmt .Errorf ("unhandled error type scanning path %s: %w" , path , err )
585+ }
586+ }
587+
572588// processFile scans a single output file, rendering live output if available.
573589func processFile (ctx context.Context , c malcontent.Config , ruleFS []fs.FS , path string , scanPath string , archiveRoot string , logger * clog.Logger ) (* malcontent.FileReport , error ) {
574590 logger = logger .With ("path" , path )
575591
576592 fr , err := scanSinglePath (ctx , c , path , ruleFS , scanPath , archiveRoot )
577- if err != nil && c .Renderer .Name () != interactive {
578- logger .Errorf ("scan path: %v" , err )
579- return nil , err
593+ if err != nil && (c .Renderer == nil || c .Renderer .Name () != interactive ) {
594+ return handleFileReportError (err , path , logger )
580595 }
581596
582597 if fr == nil {
583- logger .Debugf ("%s returned nil result" , path )
584598 return nil , nil
585599 }
586600
587- if fr .Error != "" && c .Renderer .Name () != interactive {
588- logger .Errorf ("scan error: %s" , fr .Error )
589- return nil , fmt .Errorf ("report error: %v" , fr .Error )
590- }
591-
592601 return fr , nil
593602}
594603
0 commit comments