registry.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package providers
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. // ProviderRegistry manages registered identity providers
  7. type ProviderRegistry struct {
  8. mu sync.RWMutex
  9. providers map[string]IdentityProvider
  10. }
  11. // NewProviderRegistry creates a new provider registry
  12. func NewProviderRegistry() *ProviderRegistry {
  13. return &ProviderRegistry{
  14. providers: make(map[string]IdentityProvider),
  15. }
  16. }
  17. // RegisterProvider registers a new identity provider
  18. func (r *ProviderRegistry) RegisterProvider(provider IdentityProvider) error {
  19. if provider == nil {
  20. return fmt.Errorf("provider cannot be nil")
  21. }
  22. name := provider.Name()
  23. if name == "" {
  24. return fmt.Errorf("provider name cannot be empty")
  25. }
  26. r.mu.Lock()
  27. defer r.mu.Unlock()
  28. if _, exists := r.providers[name]; exists {
  29. return fmt.Errorf("provider %s is already registered", name)
  30. }
  31. r.providers[name] = provider
  32. return nil
  33. }
  34. // GetProvider retrieves a provider by name
  35. func (r *ProviderRegistry) GetProvider(name string) (IdentityProvider, bool) {
  36. r.mu.RLock()
  37. defer r.mu.RUnlock()
  38. provider, exists := r.providers[name]
  39. return provider, exists
  40. }
  41. // ListProviders returns all registered provider names
  42. func (r *ProviderRegistry) ListProviders() []string {
  43. r.mu.RLock()
  44. defer r.mu.RUnlock()
  45. var names []string
  46. for name := range r.providers {
  47. names = append(names, name)
  48. }
  49. return names
  50. }
  51. // UnregisterProvider removes a provider from the registry
  52. func (r *ProviderRegistry) UnregisterProvider(name string) error {
  53. r.mu.Lock()
  54. defer r.mu.Unlock()
  55. if _, exists := r.providers[name]; !exists {
  56. return fmt.Errorf("provider %s is not registered", name)
  57. }
  58. delete(r.providers, name)
  59. return nil
  60. }
  61. // Clear removes all providers from the registry
  62. func (r *ProviderRegistry) Clear() {
  63. r.mu.Lock()
  64. defer r.mu.Unlock()
  65. r.providers = make(map[string]IdentityProvider)
  66. }
  67. // GetProviderCount returns the number of registered providers
  68. func (r *ProviderRegistry) GetProviderCount() int {
  69. r.mu.RLock()
  70. defer r.mu.RUnlock()
  71. return len(r.providers)
  72. }
  73. // Default global registry
  74. var defaultRegistry = NewProviderRegistry()
  75. // RegisterProvider registers a provider in the default registry
  76. func RegisterProvider(provider IdentityProvider) error {
  77. return defaultRegistry.RegisterProvider(provider)
  78. }
  79. // GetProvider retrieves a provider from the default registry
  80. func GetProvider(name string) (IdentityProvider, bool) {
  81. return defaultRegistry.GetProvider(name)
  82. }
  83. // ListProviders returns all provider names from the default registry
  84. func ListProviders() []string {
  85. return defaultRegistry.ListProviders()
  86. }