You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							109 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							109 lines
						
					
					
						
							2.5 KiB
						
					
					
				| package providers | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 	"sync" | |
| ) | |
| 
 | |
| // ProviderRegistry manages registered identity providers | |
| type ProviderRegistry struct { | |
| 	mu        sync.RWMutex | |
| 	providers map[string]IdentityProvider | |
| } | |
| 
 | |
| // NewProviderRegistry creates a new provider registry | |
| func NewProviderRegistry() *ProviderRegistry { | |
| 	return &ProviderRegistry{ | |
| 		providers: make(map[string]IdentityProvider), | |
| 	} | |
| } | |
| 
 | |
| // RegisterProvider registers a new identity provider | |
| func (r *ProviderRegistry) RegisterProvider(provider IdentityProvider) error { | |
| 	if provider == nil { | |
| 		return fmt.Errorf("provider cannot be nil") | |
| 	} | |
| 
 | |
| 	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 %s is already registered", name) | |
| 	} | |
| 
 | |
| 	r.providers[name] = provider | |
| 	return nil | |
| } | |
| 
 | |
| // GetProvider retrieves a provider by name | |
| func (r *ProviderRegistry) GetProvider(name string) (IdentityProvider, bool) { | |
| 	r.mu.RLock() | |
| 	defer r.mu.RUnlock() | |
| 
 | |
| 	provider, exists := r.providers[name] | |
| 	return provider, exists | |
| } | |
| 
 | |
| // ListProviders returns all registered provider names | |
| func (r *ProviderRegistry) ListProviders() []string { | |
| 	r.mu.RLock() | |
| 	defer r.mu.RUnlock() | |
| 
 | |
| 	var names []string | |
| 	for name := range r.providers { | |
| 		names = append(names, name) | |
| 	} | |
| 	return names | |
| } | |
| 
 | |
| // UnregisterProvider removes a provider from the registry | |
| func (r *ProviderRegistry) UnregisterProvider(name string) error { | |
| 	r.mu.Lock() | |
| 	defer r.mu.Unlock() | |
| 
 | |
| 	if _, exists := r.providers[name]; !exists { | |
| 		return fmt.Errorf("provider %s is not registered", name) | |
| 	} | |
| 
 | |
| 	delete(r.providers, name) | |
| 	return nil | |
| } | |
| 
 | |
| // Clear removes all providers from the registry | |
| func (r *ProviderRegistry) Clear() { | |
| 	r.mu.Lock() | |
| 	defer r.mu.Unlock() | |
| 
 | |
| 	r.providers = make(map[string]IdentityProvider) | |
| } | |
| 
 | |
| // GetProviderCount returns the number of registered providers | |
| func (r *ProviderRegistry) GetProviderCount() int { | |
| 	r.mu.RLock() | |
| 	defer r.mu.RUnlock() | |
| 
 | |
| 	return len(r.providers) | |
| } | |
| 
 | |
| // Default global registry | |
| var defaultRegistry = NewProviderRegistry() | |
| 
 | |
| // RegisterProvider registers a provider in the default registry | |
| func RegisterProvider(provider IdentityProvider) error { | |
| 	return defaultRegistry.RegisterProvider(provider) | |
| } | |
| 
 | |
| // GetProvider retrieves a provider from the default registry | |
| func GetProvider(name string) (IdentityProvider, bool) { | |
| 	return defaultRegistry.GetProvider(name) | |
| } | |
| 
 | |
| // ListProviders returns all provider names from the default registry | |
| func ListProviders() []string { | |
| 	return defaultRegistry.ListProviders() | |
| }
 |