pkg/adapters/kratos/options.go (64 lines of code) (raw):

package kratos import ( "context" "strings" "github.com/go-kratos/kratos/v2/transport" ) type Option struct { F func(o *options) } type options struct { ResourceExtract func(ctx context.Context, req interface{}) string BlockFallback func(ctx context.Context, req interface{}, blockErr error) (interface{}, error) EnableOutlier func(ctx context.Context) bool } func DefaultResourceExtract(ctx context.Context, req interface{}) string { if v, ok := transport.FromClientContext(ctx); ok { return v.Operation() } panic("operation is empty") } func DefaultBlockFallback(ctx context.Context, req interface{}, blockErr error) (interface{}, error) { return nil, blockErr } func DefaultEnableOutlier(ctx context.Context) bool { return false } func newOptions(opts []Option) *options { o := &options{ ResourceExtract: DefaultResourceExtract, BlockFallback: DefaultBlockFallback, EnableOutlier: DefaultEnableOutlier, } o.Apply(opts) return o } func (o *options) Apply(opts []Option) { for _, op := range opts { op.F(o) } } // WithResourceExtract sets the resource extractor func WithResourceExtract(f func(ctx context.Context, req interface{}) string) Option { return Option{F: func(o *options) { o.ResourceExtract = f }} } // WithBlockFallback sets the fallback handler func WithBlockFallback(f func(ctx context.Context, req interface{}, blockErr error) (interface{}, error)) Option { return Option{func(o *options) { o.BlockFallback = f }} } // WithEnableOutlier sets whether to enable outlier ejection func WithEnableOutlier(f func(ctx context.Context) bool) Option { return Option{func(o *options) { o.EnableOutlier = f }} } func ServiceNameExtract(ctx context.Context) string { if v, ok := transport.FromClientContext(ctx); ok { res := v.Endpoint() if strings.HasPrefix(res, "discovery:///") { return strings.TrimPrefix(res, "discovery:///") } } panic("resource name is empty") }