package keybinds import ( "fmt" "sync" ) type Registry struct { mu sync.RWMutex providers map[string]Provider } func NewRegistry() *Registry { return &Registry{ providers: make(map[string]Provider), } } func (r *Registry) Register(provider Provider) error { if provider == nil { return fmt.Errorf("cannot register nil provider") } name := provider.Name() if name == "" { return fmt.Errorf("provider name cannot be empty") } r.mu.Lock() defer r.mu.Unlock() if _, exists := r.providers[name]; exists { return fmt.Errorf("provider %q already registered", name) } r.providers[name] = provider return nil } func (r *Registry) Get(name string) (Provider, error) { r.mu.RLock() defer r.mu.RUnlock() provider, exists := r.providers[name] if !exists { return nil, fmt.Errorf("provider %q not found", name) } return provider, nil } func (r *Registry) List() []string { r.mu.RLock() defer r.mu.RUnlock() names := make([]string, 0, len(r.providers)) for name := range r.providers { names = append(names, name) } return names } var defaultRegistry = NewRegistry() func GetDefaultRegistry() *Registry { return defaultRegistry } func Register(provider Provider) error { return defaultRegistry.Register(provider) } func Get(name string) (Provider, error) { return defaultRegistry.Get(name) } func List() []string { return defaultRegistry.List() }