Documentation
¶
Overview ¶
Package protovalidate is a request validator that uses https://github.com/bufbuild/protovalidate-go under the hood.
In case of a validation failure, an `InvalidArgument` gRPC status is returned, along with a description of the validation failure.
It supports two ways of work:
1. use new annotations that will be caught and processed by `protovalidate-go` package.
2. use legacy mode, annotations will be same as for `protoc-gen-validate` and `Validate()` method will be generated.
Example of a service:
syntax = "proto3";
package cloud.instance.v1;
import "buf/validate/validate.proto";
import "validate/validate.proto";
service InstanceService {
// GetInstance is an example of request that uses a new constraints
rpc GetInstance(GetInstanceRequest) returns (GetInstanceResponse) {}
// Legacy is an example of request that uses protoc-gen-validate constraints
// their support enabled in protovalidate library constructor
rpc Legacy(LegacyRequest) returns (LegacyResponse) {}
}
message GetInstanceRequest {
string instance_id = 1 [(buf.validate.field).string.uuid = true];
}
message GetInstanceResponse {}
message LegacyRequest {
string email = 1 [(validate.rules).string.email = true]; // https://github.com/bufbuild/protoc-gen-validate
}
message LegacyResponse {}
Please consult https://github.com/bufbuild/protovalidate for details and other parameters of customization.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func StreamServerInterceptor ¶
func StreamServerInterceptor(validator protovalidate.Validator, opts ...Option) grpc.StreamServerInterceptor
StreamServerInterceptor returns a new streaming server interceptor that validates incoming messages. If the request is invalid, clients may access a structured representation of the validation failure as an error detail.
Example ¶
package main
import (
"net"
"buf.build/go/protovalidate"
protovalidate_middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/protovalidate"
testvalidatev1 "github.com/grpc-ecosystem/go-grpc-middleware/v2/testing/testvalidate/v1"
"google.golang.org/grpc"
)
type StreamService struct {
testvalidatev1.TestValidateServiceServer
}
func (s *StreamService) SendStream(_ *testvalidatev1.SendStreamRequest, _ testvalidatev1.TestValidateService_SendStreamServer) error {
return nil
}
func main() {
validator, err := protovalidate.New()
if err != nil {
panic(err) // only for example purposes
}
var (
srv = grpc.NewServer(
grpc.StreamInterceptor(
protovalidate_middleware.StreamServerInterceptor(validator,
protovalidate_middleware.WithIgnoreMessages(
(&testvalidatev1.SendStreamRequest{}).ProtoReflect().Type(),
)),
),
)
svc = &StreamService{}
)
testvalidatev1.RegisterTestValidateServiceServer(srv, svc)
listener, err := net.Listen("tcp", ":3000")
if err != nil {
panic(err) // only for example purposes
}
if err = srv.Serve(listener); err != nil {
panic(err) // only for example purposes
}
}
func UnaryServerInterceptor ¶
func UnaryServerInterceptor(validator protovalidate.Validator, opts ...Option) grpc.UnaryServerInterceptor
UnaryServerInterceptor returns a new unary server interceptor that validates incoming messages. If the request is invalid, clients may access a structured representation of the validation failure as an error detail.
Example ¶
package main
import (
"context"
"net"
"buf.build/go/protovalidate"
protovalidate_middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/protovalidate"
testvalidatev1 "github.com/grpc-ecosystem/go-grpc-middleware/v2/testing/testvalidate/v1"
"google.golang.org/grpc"
)
type UnaryService struct {
testvalidatev1.TestValidateServiceServer
}
func (s *UnaryService) Send(_ context.Context, _ *testvalidatev1.SendRequest) (*testvalidatev1.SendResponse, error) {
return &testvalidatev1.SendResponse{}, nil
}
func main() {
validator, err := protovalidate.New()
if err != nil {
panic(err) // only for example purposes
}
var (
srv = grpc.NewServer(
grpc.UnaryInterceptor(
protovalidate_middleware.UnaryServerInterceptor(validator,
protovalidate_middleware.WithIgnoreMessages(
(&testvalidatev1.SendRequest{}).ProtoReflect().Type(),
),
),
),
)
svc = &UnaryService{}
)
testvalidatev1.RegisterTestValidateServiceServer(srv, svc)
listener, err := net.Listen("tcp", ":3000")
if err != nil {
panic(err) // only for example purposes
}
if err = srv.Serve(listener); err != nil {
panic(err) // only for example purposes
}
}
Types ¶
type Option ¶
type Option func(*options)
An Option lets you add options to protovalidate interceptors using With* funcs.
func WithIgnoreMessages ¶ added in v2.1.0
func WithIgnoreMessages(msgs ...protoreflect.MessageType) Option
WithIgnoreMessages sets the messages that should be ignored by the validator. Message types are matched using their fully-qualified Protobuf names.
Use with caution and ensure validation is performed elsewhere.