Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions endpoint/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down