Skip to content

agilab/protoc-gen-atlas-validate

 
 

Repository files navigation

protoc-gen-atlas-validate

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.

Usage

Include following lines in your .proto file:

Import

import "github.com/infobloxopen/protoc-gen-atlas-validate/options/atlas_validate.proto";

Specifying options

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]}]; 
}

Generation

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.

Usage

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(),
			},
		)
	)
)

About

protoc plugin for JSON validation

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 91.4%
  • Makefile 6.0%
  • Dockerfile 2.6%