diff --git a/go.sum b/go.sum index a0fec0b..587ad07 100644 --- a/go.sum +++ b/go.sum @@ -263,16 +263,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/unistack-org/micro-codec-bytes v0.0.0-20200827104921-3616a69473a6/go.mod h1:g5sOI8TWgGZiVHe8zoUPdtz7+0oLnqTnfBoai6Qb7jE= github.com/unistack-org/micro-codec-bytes v0.0.0-20200828083432-4e49e953d844/go.mod h1:g5sOI8TWgGZiVHe8zoUPdtz7+0oLnqTnfBoai6Qb7jE= -github.com/unistack-org/micro-config-cmd v0.0.0-20200828075439-d859b9d7265b/go.mod h1:6pm1cadbwsFcEW1ZbV5Fp0i3goR3TNfROMNSPih3I8k= github.com/unistack-org/micro-config-cmd v0.0.0-20200909210346-ec89783dc46c/go.mod h1:6pm1cadbwsFcEW1ZbV5Fp0i3goR3TNfROMNSPih3I8k= github.com/unistack-org/micro-config-cmd v0.0.0-20200909210755-6e7e85eeab34/go.mod h1:fT1gYn+TtfVZZ5tNx56bZIncJjmlji66g7GKdWua5hE= github.com/unistack-org/micro-config-cmd v0.0.0-20200920140133-0853deb2e5dc h1:hHAU3rgeiA0LaudfNdMLf9/jkOBeFxvJdnwXevviZF8= github.com/unistack-org/micro-config-cmd v0.0.0-20200920140133-0853deb2e5dc/go.mod h1:il8nz4ZEcX3Usyfrtwy+YtQcb7xSUSFJdSe8PBJ9gOA= github.com/unistack-org/micro/v3 v3.0.0-20200827083227-aa99378adc6e/go.mod h1:rPQbnry3nboAnMczj8B1Gzlcyv/HYoMZLgd3/3nttJ4= -github.com/unistack-org/micro/v3 v3.0.0-gamma h1:Cac8QdtCsoqHBqcPYrclJ3btNqEiznXrDBm08VnDklU= -github.com/unistack-org/micro/v3 v3.0.0-gamma/go.mod h1:iEtpu3wTYCRs3pQ3VsFEO7JBO4lOMpkOwMyrpZyIDPo= github.com/unistack-org/micro/v3 v3.0.0-gamma.0.20200909210629-caec730248b1/go.mod h1:mmqHR9WelHUXqg2mELjsQ+FJHcWs6mNmXg+wEYO2T3c= github.com/unistack-org/micro/v3 v3.0.0-gamma.0.20200920135754-1cbd1d2bad83/go.mod h1:HUzMG4Mcy97958VxWTg8zuazZgwQ/aoLZ8wtBVONwRE= github.com/unistack-org/micro/v3 v3.0.0-gamma.0.20201001130505-cacd33e84f97 h1:py4VCI1K0dh0cl6awQwHr5nBa64u6f3xlag89ud01XA= diff --git a/validator.go b/validator.go index 4cb976f..17d0f0e 100644 --- a/validator.go +++ b/validator.go @@ -3,18 +3,72 @@ package validator import ( "context" + "github.com/unistack-org/micro/v3/client" "github.com/unistack-org/micro/v3/errors" "github.com/unistack-org/micro/v3/server" ) -type Validator interface { +type validator interface { Validate() error } +type wrapper struct { + client.Client +} + +func NewClientWrapper() client.Wrapper { + return func(c client.Client) client.Client { + handler := &wrapper{ + Client: c, + } + return handler + } +} + +func NewClientCallWrapper() client.CallWrapper { + return func(fn client.CallFunc) client.CallFunc { + return func(ctx context.Context, addr string, req client.Request, rsp interface{}, opts client.CallOptions) error { + if v, ok := req.Body().(validator); ok { + if err := v.Validate(); err != nil { + return errors.BadRequest(req.Service(), "%v", err) + } + } + return fn(ctx, addr, req, rsp, opts) + } + } +} + +func (w *wrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { + if v, ok := req.Body().(validator); ok { + if err := v.Validate(); err != nil { + return errors.BadRequest(req.Service(), "%v", err) + } + } + return w.Client.Call(ctx, req, rsp, opts...) +} + +func (w *wrapper) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Stream, error) { + if v, ok := req.Body().(validator); ok { + if err := v.Validate(); err != nil { + return nil, errors.BadRequest(req.Service(), "%v", err) + } + } + return w.Client.Stream(ctx, req, opts...) +} + +func (w *wrapper) Publish(ctx context.Context, msg client.Message, opts ...client.PublishOption) error { + if v, ok := msg.Payload().(validator); ok { + if err := v.Validate(); err != nil { + return errors.BadRequest(msg.Topic(), "%v", err) + } + } + return w.Client.Publish(ctx, msg, opts...) +} + func NewServerHandlerWrapper() server.HandlerWrapper { return func(fn server.HandlerFunc) server.HandlerFunc { return func(ctx context.Context, req server.Request, rsp interface{}) error { - if v, ok := req.Body().(Validator); ok { + if v, ok := req.Body().(validator); ok { if err := v.Validate(); err != nil { return errors.BadRequest(req.Service(), "%v", err) } @@ -23,3 +77,16 @@ func NewServerHandlerWrapper() server.HandlerWrapper { } } } + +func NewServerSubscriberWrapper() server.SubscriberWrapper { + return func(fn server.SubscriberFunc) server.SubscriberFunc { + return func(ctx context.Context, msg server.Message) error { + if v, ok := msg.Payload().(validator); ok { + if err := v.Validate(); err != nil { + return errors.BadRequest(msg.Topic(), "%v", err) + } + } + return fn(ctx, msg) + } + } +}