You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fabric/core/vendors.go

98 lines
2.0 KiB
Go

1 month ago
package core
import (
"context"
1 month ago
"fmt"
"github.com/danielmiessler/fabric/common"
"sync"
1 month ago
)
func NewVendorsManager() *VendorsManager {
return &VendorsManager{
Vendors: map[string]common.Vendor{},
1 month ago
}
}
type VendorsManager struct {
Vendors map[string]common.Vendor
Models *VendorsModels
1 month ago
}
func (o *VendorsManager) AddVendors(vendors ...common.Vendor) {
1 month ago
for _, vendor := range vendors {
o.Vendors[vendor.GetName()] = vendor
1 month ago
}
}
func (o *VendorsManager) Reset() {
o.Vendors = map[string]common.Vendor{}
1 month ago
o.Models = nil
}
func (o *VendorsManager) GetModels() *VendorsModels {
1 month ago
if o.Models == nil {
o.readModels()
}
return o.Models
1 month ago
}
func (o *VendorsManager) HasVendors() bool {
return len(o.Vendors) > 0
1 month ago
}
func (o *VendorsManager) FindByName(name string) common.Vendor {
return o.Vendors[name]
}
func (o *VendorsManager) readModels() {
1 month ago
o.Models = NewVendorsModels()
var wg sync.WaitGroup
resultsChan := make(chan modelResult, len(o.Vendors))
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
1 month ago
for _, vendor := range o.Vendors {
wg.Add(1)
go o.fetchVendorModels(ctx, &wg, vendor, resultsChan)
1 month ago
}
// Wait for all goroutines to finish
go func() {
wg.Wait()
close(resultsChan)
}()
1 month ago
// Collect results
for result := range resultsChan {
if result.err != nil {
fmt.Println(result.vendorName, result.err)
o.Models.AddError(result.err)
cancel() // Cancel remaining goroutines if needed
} else {
o.Models.AddVendorModels(result.vendorName, result.models)
1 month ago
}
}
}
func (o *VendorsManager) fetchVendorModels(
ctx context.Context, wg *sync.WaitGroup, vendor common.Vendor, resultsChan chan<- modelResult) {
1 month ago
defer wg.Done()
1 month ago
models, err := vendor.ListModels()
select {
case <-ctx.Done():
// Context canceled, don't send the result
return
case resultsChan <- modelResult{vendorName: vendor.GetName(), models: models, err: err}:
// Result sent
}
}
type modelResult struct {
vendorName string
models []string
err error
1 month ago
}