Skip to content

Commit

Permalink
Clean up types and support repeated fields.
Browse files Browse the repository at this point in the history
  • Loading branch information
achew22 committed Jan 9, 2016
1 parent fcaae47 commit b575198
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 38 deletions.
4 changes: 3 additions & 1 deletion examples/examplepb/echo_service.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
}
]
}
Expand All @@ -53,6 +54,7 @@
"name": "",
"in": "body",
"required": true,
"items": {},
"schema": {
"$ref": "#/definitions/.gengo.grpc.gateway.examples.examplepb.SimpleMessage"
}
Expand Down
1 change: 1 addition & 0 deletions examples/examplepb/streamless_everything.proto
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ message ABitOfEverything {
sfixed64 sfixed64_value = 16;
sint32 sint32_value = 17;
sint64 sint64_value = 18;
repeated string repeated_string_value = 19;
}

message EmptyMessage {
Expand Down
61 changes: 44 additions & 17 deletions examples/examplepb/streamless_everything.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"name": "",
"in": "body",
"required": true,
"items": {},
"schema": {
"$ref": "#/definitions/.gengo.grpc.gateway.examples.sub.StringMessage"
}
Expand All @@ -68,7 +69,8 @@
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
}
]
}
Expand All @@ -90,98 +92,112 @@
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "double_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "int64_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "uint64_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "int32_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "fixed64_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "fixed32_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "bool_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "string_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "uint32_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "sfixed32_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "sfixed64_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "sint32_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
},
{
"name": "sint64_value",
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
}
]
}
Expand All @@ -203,7 +219,8 @@
"in": "path",
"required": true,
"type": "string",
"format": "string"
"format": "string",
"items": {}
}
]
}
Expand Down Expand Up @@ -241,7 +258,17 @@
"format": "int64"
},
"nested": {
"$ref": "#/definitions/.gengo.grpc.gateway.examples.examplepb.ABitOfEverything.Nested"
"type": "array",
"items": {
"$ref": "#/definitions/.gengo.grpc.gateway.examples.examplepb.ABitOfEverything.Nested"
}
},
"repeated_string_value": {
"type": "array",
"items": {
"type": "string",
"format": "string"
}
},
"sfixed32_value": {
"type": "integer",
Expand Down
37 changes: 29 additions & 8 deletions protoc-gen-swagger/genswagger/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strings"

"github.com/gengo/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
pbdescriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
)

// Discover all possible Messages that can be generated by the services.
Expand Down Expand Up @@ -47,8 +48,8 @@ func renderMessagesAsDefinition(messages messageMap) swaggerDefinitionsObject {
toReturn := swaggerDefinitionsObject{}

for _, msg := range messages {
swaggerSchemaObject := swaggerSchemaObject{
Properties: map[string]swaggerSchemaPropertyObject{},
object := swaggerSchemaObject{
Properties: map[string]swaggerSchemaObject{},
}
for _, field := range msg.Fields {
var fieldType, fieldFormat string
Expand Down Expand Up @@ -137,17 +138,37 @@ func renderMessagesAsDefinition(messages messageMap) swaggerDefinitionsObject {
}

if primitive {
swaggerSchemaObject.Properties[field.GetName()] = swaggerSchemaPropertyObject{
Type: fieldType,
Format: fieldFormat,
// if repeated
if field.FieldDescriptorProto.GetLabel() == pbdescriptor.FieldDescriptorProto_LABEL_REPEATED {
object.Properties[field.GetName()] = swaggerSchemaObject{
Type: "array",
Items: &swaggerItemsObject{
Type: fieldType,
Format: fieldFormat,
},
}
} else {
object.Properties[field.GetName()] = swaggerSchemaObject{
Type: fieldType,
Format: fieldFormat,
}
}
} else {
swaggerSchemaObject.Properties[field.GetName()] = swaggerSchemaPropertyObject{
Ref: "#/definitions/" + field.GetTypeName(),
if field.FieldDescriptorProto.GetLabel() == pbdescriptor.FieldDescriptorProto_LABEL_REPEATED {
object.Properties[field.GetName()] = swaggerSchemaObject{
Type: "array",
Items: &swaggerItemsObject{
Ref: "#/definitions/" + field.GetTypeName(),
},
}
} else {
object.Properties[field.GetName()] = swaggerSchemaObject{
Ref: "#/definitions/" + field.GetTypeName(),
}
}
}
}
toReturn[msg.FQMN()] = swaggerSchemaObject
toReturn[msg.FQMN()] = object
}

return toReturn
Expand Down
33 changes: 21 additions & 12 deletions protoc-gen-swagger/genswagger/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ type binding struct {
*descriptor.Binding
}

// http://swagger.io/specification/#infoObject
type swaggerInfoObject struct {
Version string `json:"version"`
Title string `json:"title"`
}

// http://swagger.io/specification/#swaggerObject
type swaggerObject struct {
Swagger string `json:"swagger"`
Info swaggerInfoObject `json:"info"`
Expand All @@ -30,21 +32,27 @@ type swaggerObject struct {
Definitions swaggerDefinitionsObject `json:"definitions"`
}

// http://swagger.io/specification/#pathsObject
type swaggerPathsObject map[string]swaggerPathItemObject

// http://swagger.io/specification/#pathItemObject
type swaggerPathItemObject struct {
Get *swaggerOperationObject `json:"get,omitempty"`
Delete *swaggerOperationObject `json:"delete,omitempty"`
Post *swaggerOperationObject `json:"post,omitempty"`
Put *swaggerOperationObject `json:"put,omitempty"`
}

// http://swagger.io/specification/#operationObject
type swaggerOperationObject struct {
Summary string `json:"summary"`
Responses swaggerResponsesObject `json:"responses"`
Parameters swaggerParametersObject `json:"parameters,omitempty"`
}

type swaggerParametersObject []swaggerParameterObject

// http://swagger.io/specification/#parameterObject
type swaggerParameterObject struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Expand All @@ -59,37 +67,38 @@ type swaggerParameterObject struct {
Schema *swaggerSchemaObject `json:"schema,omitempty"`
}

// http://swagger.io/specification/#itemsObject
type swaggerItemsObject struct {
Ref string `json:"$ref,omitempty"`
Type string `json:"type,omitempty"`
Format string `json:"format,omitempty"`
Ref string `json:"$ref,omitempty"`
}

// http://swagger.io/specification/#responsesObject
type swaggerResponsesObject map[string]swaggerResponseObject

// http://swagger.io/specification/#responseObject
type swaggerResponseObject struct {
Description string `json:"description"`
Schema swaggerSchemaObject `json:"schema"`
}

// http://swagger.io/specification/#schemaObject
type swaggerSchemaObject struct {
Ref string `json:"$ref,omitempty"`
Type string `json:"type,omitempty"`
Properties map[string]swaggerSchemaPropertyObject `json:"properties,omitempty"`
}

type swaggerSchemaPropertyObject struct {
//Name string `json:"name"`
Ref string `json:"$ref,omitempty"`
Type string `json:"type,omitempty"`
Format string `json:"format,omitempty"`

// Or you can explicitly refer to another type. If this is defined all
// other fields should be empty
Ref string `json:"$ref,omitempty"`
// Properties can be recursively defined
Properties map[string]swaggerSchemaObject `json:"properties,omitempty"`
Items *swaggerItemsObject `json:"items,omitempty"`
}

// http://swagger.io/specification/#referenceObject
type swaggerReferenceObject struct {
Ref string `json:"$ref"`
}

// http://swagger.io/specification/#definitionsObject
type swaggerDefinitionsObject map[string]swaggerSchemaObject

type messageMap map[string]*descriptor.Message

0 comments on commit b575198

Please sign in to comment.