private Operation CreateOperation(ApiDescription apiDescription, SchemaRegistry schemaRegistry)
        {
            Contract.Requires(apiDescription != null);
            Contract.Requires(schemaRegistry != null);
            Contract.Requires(apiDescription.ParameterDescriptions != null);


            var edmModel = ((ODataRoute)apiDescription.Route).GetEdmModel();

            var parameters = apiDescription.ParameterDescriptions
                             .Select(paramDesc =>
            {
                var inPath = apiDescription.RelativePathSansQueryString().Contains("{" + paramDesc.Name + "}");
                var swaggerApiParameterDescription = paramDesc as SwaggerApiParameterDescription;
                return(swaggerApiParameterDescription != null
                    ? CreateParameter(swaggerApiParameterDescription, inPath, schemaRegistry, edmModel)
                    : CreateParameter(paramDesc, inPath, schemaRegistry, edmModel));
            })
                             .ToList();
            var responses    = new Dictionary <string, Response>();
            var responseType = apiDescription.ResponseType();

            if (responseType == null || responseType == typeof(void))
            {
                responses.Add("204", new Response {
                    description = "No Content"
                });
            }
            else
            {
                responses.Add("200", new Response {
                    description = "OK", schema = schemaRegistry.GetOrRegisterResponseType(edmModel, responseType)
                });
            }

            var operation = new Operation
            {
                summary     = apiDescription.Documentation,
                tags        = new[] { _config.GetSwashbuckleOptions().GroupingKeySelector(apiDescription) },
                operationId = apiDescription.OperationId(),
                produces    = apiDescription.Produces()?.ToList(),
                consumes    = apiDescription.Consumes()?.ToList(),
                parameters  = parameters.Any() ? parameters : null, // parameters can be null but not empty
                responses   = responses,
                deprecated  = apiDescription.IsObsolete()
            };

            foreach (var filter in _config.GetSwashbuckleOptions().OperationFilters)
            {
                Contract.Assume(filter != null);
                filter.Apply(operation, schemaRegistry, apiDescription);
            }

            return(operation);
        }