[DEPRECATED] Go implementation of plcbundle
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}