From 9456fd7ce5419ee757213b1f7901a47c53bb80ae Mon Sep 17 00:00:00 2001 From: Brian Shore Date: Wed, 12 Aug 2015 17:01:36 +0000 Subject: [PATCH] Add Middleware composition functions --- endpoint/endpoint.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/endpoint/endpoint.go b/endpoint/endpoint.go index b2590994e..443002d16 100644 --- a/endpoint/endpoint.go +++ b/endpoint/endpoint.go @@ -13,6 +13,26 @@ type Endpoint func(ctx context.Context, request interface{}) (response interface // Middleware is a chainable behavior modifier for endpoints. type Middleware func(Endpoint) Endpoint +type MWComposer func(Middleware, Middleware) Middleware + +func ComposeMW(m1, m2 Middleware) Middleware { + return func(e Endpoint) Endpoint { + return m2(m1(e)) + } +} + +func ReduceMW(c MWComposer, m Middleware, mw ...Middleware) Middleware { + l := len(mw) + if l > 1 { + // merge last two elements in list, recurse + return ReduceMW(c, m, append(mw[:l-2], c(mw[l-1], mw[l-2]))...) + } else if l == 1 { + return c(mw[0], m) + } else { + return m + } +} + // ErrBadCast indicates an unexpected concrete request or response struct was // received from an endpoint. var ErrBadCast = errors.New("bad cast")