The main purpose of this plugin is to generate a code under pb.atlas.validate.go that serves several purposes:
-
Ability to configure 'allow unknown fields' on several levels: per method, per service, per proto-file
-
Validate basic types.
-
(TBD-TODO) Possibly this can be transformed to a full-fledged ad-hoc JSON marshaller with per-service/method/file options similar to ones that OpenAPI provides.
Include following lines in your .proto
file:
import "github.com/infobloxopen/protoc-gen-atlas-validate/options/atlas_validate.proto";
Service option:
service Groups {
option (atlas_validate.service).allow_unknown_fields = true;
rpc Create(Group) returns (EmptyResponse) {
...
Method option:
rpc Update(UpdateProfileRequest) returns (EmptyResponse) {
option (atlas_validate.method).allow_unknown_fields = true;
option (google.api.http) = {
put: "/profiles/{payload.id}";
body: "payload";
};
}
}
Global option:
option (atlas_validate.file).allow_unknown_fields = false;
Field option:
message User {
//Field denied for create
int64 id = 1 [(atlas_validate.field).deny = create];
// Field denied for update and required for create and replace operations
string name = 2 [(atlas_validate.field).deny = update, (atlas_validate.field) = {require: [create, replace]}];
//Field denied for create, replace and update (ReadOnly access)
string email = 3 [(atlas_validate.field) = {deny: [create, replace, update]}];
}
Note that this plugin heavily relies on patterns generated by protoc-gen-grpc-gateway plugin:
protoc -I/usr/local/include \
-I. -I$GOPATH/src/ \
-I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway \
-I./vendor \
-I$GOPATH/src/github.com/googleapis \
--grpc-gateway_out="logtostderr=true:$GOPATH/src" \
--atlas-validate_out="$GOPATH/src" \
<path-to-your-file>
The following will generate pb.atlas.validate.go file that contains validation logic and MetadataAnnotator that you will have to include in GRPC Server options.
You can specify more than one file belonging to the same package. In this case plugin will generate validate_Object_ and validate_service_rpc_ in appropriate files with one difference that annotator and validate_Patterns are rendered either in a last output file or in file which name matches current package name (NOTE that you cannot specify files from different packages).
Import atlas-validate Interceptor:
import atlas_validate "github.com/infobloxopen/protoc-gen-atlas-validate/interceptor"
Add generated AtlasValidateAnnotator (from *.pb.atlas.validate.go) to a Metadata anotators:
gateway.WithGatewayOptions(
runtime.WithMetadata(pb.AtlasValidateAnnotator),
)
Add interceptor that extracts error from metadata and returns it to a user:
gateway.WithDialOptions(
[]grpc.DialOption{grpc.WithInsecure(), grpc.WithUnaryInterceptor(
grpc_middleware.ChainUnaryClient(
[]grpc.UnaryClientInterceptor{
gateway.ClientUnaryInterceptor,
atlas_validate.ValidationClientInterceptor(),
},
)
)
)