diff --git a/interceptors/chain/chain.go b/interceptors/chain/chain.go new file mode 100644 index 0000000..54cf52b --- /dev/null +++ b/interceptors/chain/chain.go @@ -0,0 +1,126 @@ +package chain + +import ( + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + "google.golang.org/grpc" + + "go.linka.cloud/grpc/interceptors" +) + +type Option func(*chain) + +func WithInterceptors(i ...interceptors.Interceptors) Option { + return func(c *chain) { + for _, i := range i { + if i := i.UnaryServerInterceptor(); i != nil { + c.usi = append(c.usi, i) + } + if i := i.StreamServerInterceptor(); i != nil { + c.ssi = append(c.ssi, i) + } + if i := i.UnaryClientInterceptor(); i != nil { + c.uci = append(c.uci, i) + } + if i := i.StreamClientInterceptor(); i != nil { + c.sci = append(c.sci, i) + } + } + } +} + +func WithServerInterceptors(si ...interceptors.ServerInterceptors) Option { + return func(c *chain) { + for _, i := range si { + if i := i.UnaryServerInterceptor(); i != nil { + c.usi = append(c.usi, i) + } + if i := i.StreamServerInterceptor(); i != nil { + c.ssi = append(c.ssi, i) + } + } + } +} + +func WithClientInterceptors(ci ...interceptors.ClientInterceptors) Option { + return func(c *chain) { + for _, i := range ci { + if i := i.UnaryClientInterceptor(); i != nil { + c.uci = append(c.uci, i) + } + if i := i.StreamClientInterceptor(); i != nil { + c.sci = append(c.sci, i) + } + } + } +} + +func WithUnaryServerInterceptors(usi ...grpc.UnaryServerInterceptor) Option { + return func(c *chain) { + for _, i := range usi { + if i != nil { + c.usi = append(c.usi, i) + } + } + } +} + +func WithStreamServerInterceptors(ssi ...grpc.StreamServerInterceptor) Option { + return func(c *chain) { + for _, i := range ssi { + if i != nil { + c.ssi = append(c.ssi, i) + } + } + } +} + +func WithUnaryClientInterceptors(uci ...grpc.UnaryClientInterceptor) Option { + return func(c *chain) { + for _, i := range uci { + if i != nil { + c.uci = append(c.uci, i) + } + } + } +} + +func WithStreamClientInterceptors(sci ...grpc.StreamClientInterceptor) Option { + return func(c *chain) { + for _, i := range sci { + if i != nil { + c.sci = append(c.sci, i) + } + } + } +} + +func New(opts ...Option) interceptors.Interceptors { + c := &chain{} + for _, o := range opts { + o(c) + } + return c +} + +type chain struct { + usi []grpc.UnaryServerInterceptor + ssi []grpc.StreamServerInterceptor + uci []grpc.UnaryClientInterceptor + sci []grpc.StreamClientInterceptor +} + +func (c *chain) UnaryServerInterceptor() grpc.UnaryServerInterceptor { + return grpc_middleware.ChainUnaryServer(c.usi...) +} + +func (c *chain) StreamServerInterceptor() grpc.StreamServerInterceptor { + return grpc_middleware.ChainStreamServer(c.ssi...) +} + +func (c *chain) UnaryClientInterceptor() grpc.UnaryClientInterceptor { + return grpc_middleware.ChainUnaryClient(c.uci...) +} + +func (c *chain) StreamClientInterceptor() grpc.StreamClientInterceptor { + return grpc_middleware.ChainStreamClient(c.sci...) +}