...
1 package middleware
2
3 import (
4 "context"
5 )
6
7
8
9 type Handler interface {
10
11
12 Handle(ctx context.Context, input interface{}) (
13 output interface{}, metadata Metadata, err error,
14 )
15 }
16
17
18
19 type HandlerFunc func(ctx context.Context, input interface{}) (
20 output interface{}, metadata Metadata, err error,
21 )
22
23
24 func (fn HandlerFunc) Handle(ctx context.Context, input interface{}) (
25 output interface{}, metadata Metadata, err error,
26 ) {
27 return fn(ctx, input)
28 }
29
30
31 type Middleware interface {
32
33 ID() string
34
35
36
37
38 HandleMiddleware(ctx context.Context, input interface{}, next Handler) (
39 output interface{}, metadata Metadata, err error,
40 )
41 }
42
43
44
45 type decoratedHandler struct {
46
47 Next Handler
48
49
50 With Middleware
51 }
52
53
54 func (m decoratedHandler) Handle(ctx context.Context, input interface{}) (
55 output interface{}, metadata Metadata, err error,
56 ) {
57 return m.With.HandleMiddleware(ctx, input, m.Next)
58 }
59
60
61
62 func DecorateHandler(h Handler, with ...Middleware) Handler {
63 for i := len(with) - 1; i >= 0; i-- {
64 h = decoratedHandler{
65 Next: h,
66 With: with[i],
67 }
68 }
69
70 return h
71 }
72
View as plain text