[DEPRECATED] Go implementation of plcbundle
at rust-test 88 lines 1.7 kB view raw
1// detector/registry.go 2package detector 3 4import ( 5 "fmt" 6 "sync" 7) 8 9// Registry manages available detectors 10type Registry struct { 11 detectors map[string]Detector 12 mu sync.RWMutex 13} 14 15// NewRegistry creates a new detector registry 16func NewRegistry() *Registry { 17 return &Registry{ 18 detectors: make(map[string]Detector), 19 } 20} 21 22// Register adds a detector to the registry 23func (r *Registry) Register(d Detector) error { 24 r.mu.Lock() 25 defer r.mu.Unlock() 26 27 name := d.Name() 28 if _, exists := r.detectors[name]; exists { 29 return fmt.Errorf("detector %q already registered", name) 30 } 31 32 r.detectors[name] = d 33 return nil 34} 35 36// Get retrieves a detector by name 37func (r *Registry) Get(name string) (Detector, error) { 38 r.mu.RLock() 39 defer r.mu.RUnlock() 40 41 d, ok := r.detectors[name] 42 if !ok { 43 return nil, fmt.Errorf("detector %q not found", name) 44 } 45 46 return d, nil 47} 48 49// List returns all registered detectors 50func (r *Registry) List() []Detector { 51 r.mu.RLock() 52 defer r.mu.RUnlock() 53 54 detectors := make([]Detector, 0, len(r.detectors)) 55 for _, d := range r.detectors { 56 detectors = append(detectors, d) 57 } 58 59 return detectors 60} 61 62// Names returns all detector names 63func (r *Registry) Names() []string { 64 r.mu.RLock() 65 defer r.mu.RUnlock() 66 67 names := make([]string, 0, len(r.detectors)) 68 for name := range r.detectors { 69 names = append(names, name) 70 } 71 72 return names 73} 74 75// DefaultRegistry returns a registry with built-in detectors 76func DefaultRegistry() *Registry { 77 r := NewRegistry() 78 79 r.Register(NewNoOpDetector()) 80 81 // Register real spam detectors 82 r.Register(NewInvalidHandleDetector()) 83 r.Register(NewAlsoKnownAsSpamDetector()) 84 r.Register(NewSpamPDSDetector()) 85 r.Register(NewServiceAbuseDetector()) 86 87 return r 88}