package genswagger import ( "bytes" "encoding/json" "fmt" "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor" ) type param struct { *descriptor.File reg *descriptor.Registry } type binding struct { *descriptor.Binding } // http://swagger.io/specification/#infoObject type swaggerInfoObject struct { Title string `json:"title"` Description string `json:"description,omitempty"` TermsOfService string `json:"termsOfService,omitempty"` Version string `json:"version"` Contact *swaggerContactObject `json:"contact,omitempty"` License *swaggerLicenseObject `json:"license,omitempty"` extensions []extension } // http://swagger.io/specification/#contactObject type swaggerContactObject struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` Email string `json:"email,omitempty"` } // http://swagger.io/specification/#licenseObject type swaggerLicenseObject struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` } // http://swagger.io/specification/#externalDocumentationObject type swaggerExternalDocumentationObject struct { Description string `json:"description,omitempty"` URL string `json:"url,omitempty"` } type extension struct { key string value json.RawMessage } // http://swagger.io/specification/#swaggerObject type swaggerObject struct { Swagger string `json:"swagger"` Info swaggerInfoObject `json:"info"` Host string `json:"host,omitempty"` BasePath string `json:"basePath,omitempty"` Schemes []string `json:"schemes,omitempty"` Consumes []string `json:"consumes"` Produces []string `json:"produces"` Paths swaggerPathsObject `json:"paths"` Definitions swaggerDefinitionsObject `json:"definitions"` SecurityDefinitions swaggerSecurityDefinitionsObject `json:"securityDefinitions,omitempty"` Security []swaggerSecurityRequirementObject `json:"security,omitempty"` ExternalDocs *swaggerExternalDocumentationObject `json:"externalDocs,omitempty"` extensions []extension } // http://swagger.io/specification/#securityDefinitionsObject type swaggerSecurityDefinitionsObject map[string]swaggerSecuritySchemeObject // http://swagger.io/specification/#securitySchemeObject type swaggerSecuritySchemeObject struct { Type string `json:"type"` Description string `json:"description,omitempty"` Name string `json:"name,omitempty"` In string `json:"in,omitempty"` Flow string `json:"flow,omitempty"` AuthorizationURL string `json:"authorizationUrl,omitempty"` TokenURL string `json:"tokenUrl,omitempty"` Scopes swaggerScopesObject `json:"scopes,omitempty"` extensions []extension } // http://swagger.io/specification/#scopesObject type swaggerScopesObject map[string]string // http://swagger.io/specification/#securityRequirementObject type swaggerSecurityRequirementObject map[string][]string // 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"` Patch *swaggerOperationObject `json:"patch,omitempty"` } // http://swagger.io/specification/#operationObject type swaggerOperationObject struct { Summary string `json:"summary,omitempty"` Description string `json:"description,omitempty"` OperationID string `json:"operationId"` Responses swaggerResponsesObject `json:"responses"` Parameters swaggerParametersObject `json:"parameters,omitempty"` Tags []string `json:"tags,omitempty"` Deprecated bool `json:"deprecated,omitempty"` Produces []string `json:"produces,omitempty"` Security *[]swaggerSecurityRequirementObject `json:"security,omitempty"` ExternalDocs *swaggerExternalDocumentationObject `json:"externalDocs,omitempty"` extensions []extension } type swaggerParametersObject []swaggerParameterObject // http://swagger.io/specification/#parameterObject type swaggerParameterObject struct { Name string `json:"name"` Description string `json:"description,omitempty"` In string `json:"in,omitempty"` Required bool `json:"required"` Type string `json:"type,omitempty"` Format string `json:"format,omitempty"` Items *swaggerItemsObject `json:"items,omitempty"` Enum []string `json:"enum,omitempty"` CollectionFormat string `json:"collectionFormat,omitempty"` Default string `json:"default,omitempty"` MinItems *int `json:"minItems,omitempty"` // Or you can explicitly refer to another type. If this is defined all // other fields should be empty Schema *swaggerSchemaObject `json:"schema,omitempty"` } // core part of schema, which is common to itemsObject and schemaObject. // http://swagger.io/specification/#itemsObject type schemaCore struct { Type string `json:"type,omitempty"` Format string `json:"format,omitempty"` Ref string `json:"$ref,omitempty"` Example json.RawMessage `json:"example,omitempty"` Items *swaggerItemsObject `json:"items,omitempty"` // If the item is an enumeration include a list of all the *NAMES* of the // enum values. I'm not sure how well this will work but assuming all enums // start from 0 index it will be great. I don't think that is a good assumption. Enum []string `json:"enum,omitempty"` Default string `json:"default,omitempty"` } func (s *schemaCore) setRefFromFQN(ref string, reg *descriptor.Registry) error { name, ok := fullyQualifiedNameToSwaggerName(ref, reg) if !ok { return fmt.Errorf("setRefFromFQN: can't resolve swagger name from '%v'", ref) } s.Ref = fmt.Sprintf("#/definitions/%s", name) return nil } type swaggerItemsObject schemaCore // 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"` Examples map[string]interface{} `json:"examples,omitempty"` extensions []extension } type keyVal struct { Key string Value interface{} } type swaggerSchemaObjectProperties []keyVal func (op swaggerSchemaObjectProperties) MarshalJSON() ([]byte, error) { var buf bytes.Buffer buf.WriteString("{") for i, kv := range op { if i != 0 { buf.WriteString(",") } key, err := json.Marshal(kv.Key) if err != nil { return nil, err } buf.Write(key) buf.WriteString(":") val, err := json.Marshal(kv.Value) if err != nil { return nil, err } buf.Write(val) } buf.WriteString("}") return buf.Bytes(), nil } // http://swagger.io/specification/#schemaObject type swaggerSchemaObject struct { schemaCore // Properties can be recursively defined Properties *swaggerSchemaObjectProperties `json:"properties,omitempty"` AdditionalProperties *swaggerSchemaObject `json:"additionalProperties,omitempty"` Description string `json:"description,omitempty"` Title string `json:"title,omitempty"` ExternalDocs *swaggerExternalDocumentationObject `json:"externalDocs,omitempty"` ReadOnly bool `json:"readOnly,omitempty"` MultipleOf float64 `json:"multipleOf,omitempty"` Maximum float64 `json:"maximum,omitempty"` ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` Minimum float64 `json:"minimum,omitempty"` ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` MaxLength uint64 `json:"maxLength,omitempty"` MinLength uint64 `json:"minLength,omitempty"` Pattern string `json:"pattern,omitempty"` MaxItems uint64 `json:"maxItems,omitempty"` MinItems uint64 `json:"minItems,omitempty"` UniqueItems bool `json:"uniqueItems,omitempty"` MaxProperties uint64 `json:"maxProperties,omitempty"` MinProperties uint64 `json:"minProperties,omitempty"` Required []string `json:"required,omitempty"` } // http://swagger.io/specification/#referenceObject type swaggerReferenceObject struct { Ref string `json:"$ref"` } // http://swagger.io/specification/#definitionsObject type swaggerDefinitionsObject map[string]swaggerSchemaObject // Internal type mapping from FQMN to descriptor.Message. Used as a set by the // findServiceMessages function. type messageMap map[string]*descriptor.Message // Internal type mapping from FQEN to descriptor.Enum. Used as a set by the // findServiceMessages function. type enumMap map[string]*descriptor.Enum // Internal type to store used references. type refMap map[string]struct{}