diff --git a/protoc-gen-grpc-gateway/descriptor/registry.go b/protoc-gen-grpc-gateway/descriptor/registry.go index 16df86b4436..74e67b8981a 100644 --- a/protoc-gen-grpc-gateway/descriptor/registry.go +++ b/protoc-gen-grpc-gateway/descriptor/registry.go @@ -36,6 +36,9 @@ type Registry struct { // allowDeleteBody permits http delete methods to have a body allowDeleteBody bool + + // allowMerge generation one swagger file out of multiple protos + allowMerge bool } // NewRegistry returns a new Registry. @@ -282,6 +285,16 @@ func (r *Registry) SetAllowDeleteBody(allow bool) { r.allowDeleteBody = allow } +// SetAllowMerge controls whether generation one swagger file out of multiple protos +func (r *Registry) SetAllowMerge(allow bool) { + r.allowMerge = allow +} + +// IsAllowMerge whether generation one swagger file out of multiple protos +func (r *Registry) IsAllowMerge() bool { + return r.allowMerge +} + // sanitizePackageName replaces unallowed character in package name // with allowed character. func sanitizePackageName(pkgName string) string { diff --git a/protoc-gen-swagger/genswagger/generator.go b/protoc-gen-swagger/genswagger/generator.go index 697e540b4ae..08237921d4e 100644 --- a/protoc-gen-swagger/genswagger/generator.go +++ b/protoc-gen-swagger/genswagger/generator.go @@ -13,6 +13,7 @@ import ( plugin "github.com/golang/protobuf/protoc-gen-go/plugin" "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor" gen "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/generator" + swagger_options "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" ) var ( @@ -30,6 +31,30 @@ func New(reg *descriptor.Registry) gen.Generator { func (g *generator) Generate(targets []*descriptor.File) ([]*plugin.CodeGeneratorResponse_File, error) { var files []*plugin.CodeGeneratorResponse_File + if g.reg.IsAllowMerge() { + var mergedTarget *descriptor.File + // try to find proto leader + for _, f := range targets { + if proto.HasExtension(f.Options, swagger_options.E_Openapiv2Swagger) { + mergedTarget = f + break + } + } + // merge protos to leader + for _, f := range targets { + if mergedTarget == nil { + mergedTarget = f + } else { + mergedTarget.Enums = append(mergedTarget.Enums, f.Enums...) + mergedTarget.Messages = append(mergedTarget.Messages, f.Messages...) + mergedTarget.Services = append(mergedTarget.Services, f.Services...) + } + } + + targets = nil + targets = append(targets, mergedTarget) + } + for _, file := range targets { glog.V(1).Infof("Processing %s", file.GetName()) code, err := applyTemplate(param{File: file, reg: g.reg}) diff --git a/protoc-gen-swagger/main.go b/protoc-gen-swagger/main.go index ebbaecbd36f..a1387b1b9c8 100644 --- a/protoc-gen-swagger/main.go +++ b/protoc-gen-swagger/main.go @@ -19,6 +19,7 @@ var ( importPrefix = flag.String("import_prefix", "", "prefix to be added to go package paths for imported proto files") file = flag.String("file", "-", "where to load data from") allowDeleteBody = flag.Bool("allow_delete_body", false, "unless set, HTTP DELETE methods may not have a body") + allowMerge = flag.Bool("allow_merge", false, "if set, generation one swagger file out of multiple protos") ) func parseReq(r io.Reader) (*plugin.CodeGeneratorRequest, error) { @@ -66,6 +67,7 @@ func main() { reg.SetPrefix(*importPrefix) reg.SetAllowDeleteBody(*allowDeleteBody) + reg.SetAllowMerge(*allowMerge) for k, v := range pkgMap { reg.AddPkgMap(k, v) }