mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-05 21:15:38 -05:00
80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
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()
|
|
}
|