func LoadFeed()

in cvefeed/dictionary.go [50:95]


func LoadFeed(loadFunc func(string) ([]Vuln, error), paths ...string) (Dictionary, error) {
	dict := make(Dictionary)
	var wg sync.WaitGroup
	done := make(chan struct{})
	errDone := make(chan struct{})
	dictChan := make(chan []Vuln, 1)
	errChan := make(chan error, 1)
	for _, path := range paths {
		wg.Add(1)
		go func(path string) {
			defer wg.Done()
			feed, err := loadFunc(path)
			if err != nil {
				errChan <- fmt.Errorf("dictionary: failed to load feed %q: %v", path, err)
				return
			}
			dictChan <- feed
		}(path)
	}
	go func() {
		for d := range dictChan {
			for _, cve := range d {
				if cveid := cve.ID(); cveid != "" {
					dict[cveid] = cve
				}
			}
		}
		close(done)
	}()
	var errs []string
	go func() {
		for e := range errChan {
			errs = append(errs, e.Error())
		}
		close(errDone)
	}()
	wg.Wait()
	close(dictChan)
	close(errChan)
	<-done
	<-errDone
	if len(errs) > 0 {
		return dict, errors.New(strings.Join(errs, "\n"))
	}
	return dict, nil
}