mirror of
https://github.com/linka-cloud/grpc.git
synced 2024-11-27 21:36:25 +00:00
127 lines
2.7 KiB
Go
127 lines
2.7 KiB
Go
package chain
|
|
|
|
import (
|
|
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
|
|
"google.golang.org/grpc"
|
|
|
|
"go.linka.cloud/grpc-toolkit/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...)
|
|
}
|