From 9051fb7b6e5259a7bd0e0367b5ad8244123323de Mon Sep 17 00:00:00 2001 From: Phillip Michelsen Date: Mon, 22 Sep 2025 22:11:49 +0800 Subject: [PATCH] Added worker registry in registry.go --- .../data_service/internal/worker/registry.go | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 services/data_service/internal/worker/registry.go diff --git a/services/data_service/internal/worker/registry.go b/services/data_service/internal/worker/registry.go new file mode 100644 index 0000000..d33109e --- /dev/null +++ b/services/data_service/internal/worker/registry.go @@ -0,0 +1,68 @@ +package worker + +import ( + "fmt" + "sync" +) + +type Factory func() Worker + +type Registry struct { + mu sync.RWMutex + workerFactories map[string]Factory +} + +func NewRegistry() *Registry { + return &Registry{ + workerFactories: make(map[string]Factory), + } +} + +func (r *Registry) Register(workerType string, workerFactory Factory) error { + r.mu.Lock() + defer r.mu.Unlock() + + if _, ok := r.workerFactories[workerType]; ok { + return fmt.Errorf("worker already registered: %s", workerType) + } + + if workerFactory == nil { + return fmt.Errorf("nil workerFactory provided for: %s", workerType) + } + + r.workerFactories[workerType] = workerFactory + + return nil +} + +func (r *Registry) Spawn(workerType string) (Worker, error) { + r.mu.RLock() + defer r.mu.RUnlock() + + workerFactory, ok := r.workerFactories[workerType] + if !ok { + return nil, fmt.Errorf("unknown worker type: %s", workerType) + } + + return workerFactory(), nil +} + +func (r *Registry) RegisteredWorkers() []string { + r.mu.RLock() + defer r.mu.RUnlock() + + workerTypes := make([]string, 0, len(r.workerFactories)) + for k := range r.workerFactories { + workerTypes = append(workerTypes, k) + } + + return workerTypes +} + +func (r *Registry) Factory(workerType string) (Factory, bool) { + r.mu.RLock() + defer r.mu.RUnlock() + + workerFactory, ok := r.workerFactories[workerType] + return workerFactory, ok +}