Skip to content

protoc-gen-swagger map type filed doesn't support options.openapiv2_field #1601

Closed
@yangxikun

Description

@yangxikun

🐛 Bug Report

message GetSubjectPermissions2DReply{
  map<string, ListOfString> permissions = 1 [(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "展开的二级权限列表", description:"展开的二级权限列表"}];
}

generated swagger json:

    "HodorGetSubjectPermissions2DReply": {
      "type": "object",
      "properties": {
        "permissions": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/HodorListOfString"
          }
        }
      },
      "title": "GetSubjectPermissions2DReply"
    },

permissions.title and permissions.description is not set.

Your Environment

grpc-gateway v1.14.6

Other Info

I dig into the source code of protoc-gen-swagger, found the problem is in template.go:schemaOfField

// schemaOfField returns a swagger Schema Object for a protobuf field.
func schemaOfField(f *descriptor.Field, reg *descriptor.Registry, refs refMap) swaggerSchemaObject {
	const (
		singular = 0
		array    = 1
		object   = 2
	)
	var (
		core      schemaCore
		aggregate int
	)

	fd := f.FieldDescriptorProto
	if m, err := reg.LookupMsg("", f.GetTypeName()); err == nil {
		if opt := m.GetOptions(); opt != nil && opt.MapEntry != nil && *opt.MapEntry {
			fd = m.GetField()[1]
			aggregate = object
		}
	}
	if fd.GetLabel() == pbdescriptor.FieldDescriptorProto_LABEL_REPEATED {
		aggregate = array
	}
        ……
}

When the field is map type, fd = m.GetField()[1] use the value's FieldDescriptorProto. Because the mapentry is auto generate, so the fd.Options is always nil.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions