package scraper import ( "fmt" "sync" ) // Registry manages available scrapers type Registry struct { mu sync.RWMutex scrapers map[string]Scraper } // NewRegistry creates a new scraper registry func NewRegistry() *Registry { return &Registry{ scrapers: make(map[string]Scraper), } } // Register adds a scraper to the registry func (r *Registry) Register(s Scraper) error { r.mu.Lock() defer r.mu.Unlock() name := s.Name() if _, exists := r.scrapers[name]; exists { return fmt.Errorf("scraper %q already registered", name) } r.scrapers[name] = s return nil } // Get retrieves a scraper by name func (r *Registry) Get(name string) (Scraper, error) { r.mu.RLock() defer r.mu.RUnlock() s, ok := r.scrapers[name] if !ok { return nil, fmt.Errorf("scraper %q not found", name) } return s, nil } // List returns all registered scraper names func (r *Registry) List() []string { r.mu.RLock() defer r.mu.RUnlock() names := make([]string, 0, len(r.scrapers)) for name := range r.scrapers { names = append(names, name) } return names }