private ParameterSpec GenerateParameterSpec(ApiParameterDescription parameterDescription, string apiPath, ModelSpecMap modelSpecMap) { var paramType = ""; switch (parameterDescription.Source) { case ApiParameterSource.FromBody: paramType = "body"; break; case ApiParameterSource.FromUri: paramType = apiPath.Contains(parameterDescription.Name) ? "path" : "query"; break; } var paramSpec = new ParameterSpec { ParamType = paramType, Name = parameterDescription.Name, Description = parameterDescription.Documentation, Required = !parameterDescription.ParameterDescriptor.IsOptional }; var modelSpec = modelSpecMap.FindOrCreateFor(parameterDescription.ParameterDescriptor.ParameterType); if (modelSpec.Type == "object") { paramSpec.Type = modelSpec.Id; } else { paramSpec.Type = modelSpec.Type; paramSpec.Format = modelSpec.Format; paramSpec.Items = modelSpec.Items; paramSpec.Enum = modelSpec.Enum; } return paramSpec; }
private OperationSpec GenerateOperationSpec(ApiDescription apiDescription, ModelSpecMap modelSpecMap) { var apiPath = apiDescription.RelativePath.Split('?').First(); var paramSpecs = apiDescription.ParameterDescriptions .Select(paramDesc => GenerateParameterSpec(paramDesc, apiPath, modelSpecMap)) .ToList(); var operationSpec = new OperationSpec { Method = apiDescription.HttpMethod.Method, Nickname = String.Format("{0}_{1}", apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName, apiDescription.ActionDescriptor.ActionName), Summary = apiDescription.Documentation, Parameters = paramSpecs, ResponseMessages = new List<ResponseMessageSpec>() }; var returnType = apiDescription.ActionDescriptor.ReturnType; if (returnType == null) { operationSpec.Type = "void"; } else if (returnType != typeof(HttpResponseMessage)) { var modelSpec = modelSpecMap.FindOrCreateFor(returnType); if (modelSpec.Type == "object") { operationSpec.Type = modelSpec.Id; } else { operationSpec.Type = modelSpec.Type; operationSpec.Format = modelSpec.Format; operationSpec.Items = modelSpec.Items; operationSpec.Enum = modelSpec.Enum; } } foreach (var filter in _operationSpecFilters) { filter.Apply(apiDescription, operationSpec, modelSpecMap); } return operationSpec; }