Trigger executes all registered hook handlers one by one with the specified event as an argument. Optionally, this method allows also to register additional one off handler funcs that will be temporary appended to the handlers queue. NB! Each hook handler must call event.Next() in order the hook c
(event T, oneOffHandlerFuncs ...func(T) error)
| 151 | // |
| 152 | // NB! Each hook handler must call event.Next() in order the hook chain to proceed. |
| 153 | func (h *Hook[T]) Trigger(event T, oneOffHandlerFuncs ...func(T) error) error { |
| 154 | h.mu.RLock() |
| 155 | handlers := make([]func(T) error, 0, len(h.handlers)+len(oneOffHandlerFuncs)) |
| 156 | for _, handler := range h.handlers { |
| 157 | handlers = append(handlers, handler.Func) |
| 158 | } |
| 159 | handlers = append(handlers, oneOffHandlerFuncs...) |
| 160 | h.mu.RUnlock() |
| 161 | |
| 162 | event.setNextFunc(nil) // reset in case the event is being reused |
| 163 | |
| 164 | for i := len(handlers) - 1; i >= 0; i-- { |
| 165 | i := i |
| 166 | old := event.nextFunc() |
| 167 | event.setNextFunc(func() error { |
| 168 | event.setNextFunc(old) |
| 169 | return handlers[i](event) |
| 170 | }) |
| 171 | } |
| 172 | |
| 173 | return event.Next() |
| 174 | } |
| 175 | |
| 176 | func generateHookId() string { |
| 177 | return security.PseudorandomString(20) |