package push import ( "sync" ) // Registry manages push notification handlers type Registry struct { mu sync.RWMutex handlers map[string]NotificationHandler protected map[string]bool } // NewRegistry creates a new push notification registry func NewRegistry() *Registry { return &Registry{ handlers: make(map[string]NotificationHandler), protected: make(map[string]bool), } } // RegisterHandler registers a handler for a specific push notification name func (r *Registry) RegisterHandler(pushNotificationName string, handler NotificationHandler, protected bool) error { if handler == nil { return ErrHandlerNil } r.mu.Lock() defer r.mu.Unlock() // Check if handler already exists if _, exists := r.protected[pushNotificationName]; exists { return ErrHandlerExists(pushNotificationName) } r.handlers[pushNotificationName] = handler r.protected[pushNotificationName] = protected return nil } // GetHandler returns the handler for a specific push notification name func (r *Registry) GetHandler(pushNotificationName string) NotificationHandler { r.mu.RLock() defer r.mu.RUnlock() return r.handlers[pushNotificationName] } // UnregisterHandler removes a handler for a specific push notification name func (r *Registry) UnregisterHandler(pushNotificationName string) error { r.mu.Lock() defer r.mu.Unlock() // Check if handler is protected if protected, exists := r.protected[pushNotificationName]; exists && protected { return ErrProtectedHandler(pushNotificationName) } delete(r.handlers, pushNotificationName) delete(r.protected, pushNotificationName) return nil }