shadow1ng/fscan · error

fscan: result handler is required

Error message

fscan: result handler is required

What it means

Guard in Scanner.scanEach: a nil ResultHandler callback was passed, but the streaming API requires one to deliver each Result; without it results would be silently dropped. Use Scan (collectReport) if no callback is wanted.

Source

Thrown at pkg/fscan/scanner.go:194

		results []Result
	)
	stats, err := s.scanEach(ctx, opts, func(result Result) error {
		mu.Lock()
		results = append(results, result)
		mu.Unlock()
		return nil
	}, targets...)
	results = snapshotResults(&mu, results)
	return ScanReport{
		Results: results,
		Summary: SummarizeResults(results),
		Stats:   stats,
	}, err
}

func (s *Scanner) scanEach(ctx context.Context, opts scanOpts, handle ResultHandler, targets ...Target) (ScanStats, error) {
	if handle == nil {
		return ScanStats{}, fmt.Errorf("fscan: result handler is required")
	}
	if ctx == nil {
		ctx = context.Background()
	}
	if len(targets) == 0 {
		targets = s.config.Targets
	}
	if err := validateConfig(s.config, targets); err != nil {
		return ScanStats{}, err
	}

	ctrl := opts.controller
	if ctrl == nil && s.config.OnProgress != nil {
		ctrl = newScanController()
	}

	ctx, cancel := context.WithCancel(ctx)
	defer cancel()

View on GitHub (pinned to 95cc12e753)

Solutions

  1. Pass a non-nil func(Result) error to ScanEach
  2. Use Scanner.Scan which supplies its own collector and returns a ScanReport
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at pkg/fscan/scanner.go:194 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of shadow1ng/fscan@95cc12e753 (2026-09-06). Data as JSON: /api/errors/1bdf01d4a9a58934. Report an issue: GitHub.