MiddlewareChain chains together the given middleware functions, returning a single function that applies them all in reverse order.
(globalMiddleware []rivertype.Middleware, workerMiddleware []rivertype.WorkerMiddleware, doInner Func, jobRow *rivertype.JobRow)
| 15 | // MiddlewareChain chains together the given middleware functions, returning a |
| 16 | // single function that applies them all in reverse order. |
| 17 | func MiddlewareChain(globalMiddleware []rivertype.Middleware, workerMiddleware []rivertype.WorkerMiddleware, doInner Func, jobRow *rivertype.JobRow) Func { |
| 18 | // Quick return for no middleware, which will often be the case. |
| 19 | if len(globalMiddleware) < 1 && len(workerMiddleware) < 1 { |
| 20 | return doInner |
| 21 | } |
| 22 | |
| 23 | // Wrap middlewares in reverse order so the one defined first is wrapped |
| 24 | // as the outermost function and is first to receive the operation. |
| 25 | for i := len(globalMiddleware) - 1; i >= 0; i-- { |
| 26 | middlewareItem := globalMiddleware[i].(rivertype.WorkerMiddleware) //nolint:forcetypeassert // capture the current middleware item |
| 27 | previousDoInner := doInner // capture the current doInner function |
| 28 | doInner = func(ctx context.Context) error { |
| 29 | return middlewareItem.Work(ctx, jobRow, previousDoInner) |
| 30 | } |
| 31 | } |
| 32 | |
| 33 | for i := len(workerMiddleware) - 1; i >= 0; i-- { |
| 34 | middlewareItem := workerMiddleware[i] // capture the current middleware item |
| 35 | previousDoInner := doInner // capture the current doInner function |
| 36 | doInner = func(ctx context.Context) error { |
| 37 | return middlewareItem.Work(ctx, jobRow, previousDoInner) |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | return doInner |
| 42 | } |