package main
import (
"context"
"fmt"
"log"
)
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
type UnaryServerInterceptor func(ctx context.Context, req interface{}, handler UnaryHandler) (resp interface{}, err error)
func HelloInterceptor(ctx context.Context, req interface{}, handler UnaryHandler) (interface{}, error){
log.Println("hello")
resp, err := handler(ctx, req)
log.Println("see you")
return resp, err
}
func HelloInterceptor1(ctx context.Context, req interface{}, handler UnaryHandler) (interface{}, error){
log.Println("hello1")
resp, err := handler(ctx, req)
log.Println("see you1")
return resp, err
}
func ChainUnaryServer(interceptors ...UnaryServerInterceptor) UnaryServerInterceptor {
n := len(interceptors)
return func(ctx context.Context, req interface{}, handler UnaryHandler) (resp interface{}, err error) {
chainer := func(currentInter UnaryServerInterceptor, currentHandler UnaryHandler) UnaryHandler {
return func(currentCtx context.Context, currentReq interface{}) (interface{}, error) {
return currentInter(currentCtx, currentReq, currentHandler)
}
}
chainerHandler := handler
for i := n - 1; i >= 0; i -- {
chainerHandler = chainer(interceptors[i], chainerHandler)
}
return chainerHandler(ctx, req)
}
}
func main() {
interceptor := ChainUnaryServer(HelloInterceptor, HelloInterceptor1)
i, err := interceptor(context.Background(), nil, func(ctx context.Context, req interface{}) (interface{}, error) {
return nil, nil
})
if err != nil {
return
}
fmt.Println(i)
}