package provider import ( "fmt" "sort" "sync" ) type Factory func(cfg ProviderConfig) (Provider, error) var ( registry = map[string]Factory{} registryMu sync.RWMutex ) func Register(name string, factory Factory) { registryMu.Lock() defer registryMu.Unlock() registry[name] = factory } func New(name string, cfg ProviderConfig) (Provider, error) { registryMu.RLock() factory, ok := registry[name] registryMu.RUnlock() if !ok { return nil, fmt.Errorf("unknown provider: %s (run 'ry provider add %s' first)", name, name) } return factory(cfg) } func List() []string { registryMu.RLock() defer registryMu.RUnlock() names := make([]string, 0, len(registry)) for name := range registry { names = append(names, name) } sort.Strings(names) return names }