private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, string name, string description, Type type, IList <Attribute> parentAttributes, ISchemaResolver schemaResolver) { var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); var parameterType = typeDescription.IsComplexType ? typeof(string) : type; // complex types must be treated as string var operationParameter = new SwaggerParameter(); typeDescription.ApplyType(operationParameter); if (parameterType.GetTypeInfo().IsEnum) { operationParameter.SchemaReference = schemaGenerator.Generate <JsonSchema4>(parameterType, null, parentAttributes, schemaDefinitionAppender, schemaResolver); } else { schemaGenerator.ApplyPropertyAnnotations(operationParameter, type, parentAttributes, typeDescription); } operationParameter.Name = name; operationParameter.IsRequired = parentAttributes?.Any(a => a.GetType().Name == "RequiredAttribute") ?? false; operationParameter.IsNullableRaw = typeDescription.IsNullable; if (description != string.Empty) { operationParameter.Description = description; } return(operationParameter); }
/// <summary>Generates a Swagger specification for the given controller types.</summary> /// <param name="controllerTypes">The types of the controller.</param> /// <param name="excludedMethodName">The name of the excluded method name.</param> /// <returns>The <see cref="SwaggerService" />.</returns> /// <exception cref="InvalidOperationException">The operation has more than one body parameter.</exception> public SwaggerService GenerateForControllers(IEnumerable <Type> controllerTypes, string excludedMethodName = "Swagger") { var service = CreateService(Settings); var schemaResolver = new SchemaResolver(); var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); foreach (var controllerType in controllerTypes) { GenerateForController(service, controllerType, excludedMethodName, schemaResolver, schemaDefinitionAppender); } service.GenerateOperationIds(); return(service); }
/// <summary>Generates a Swagger specification for the given controller types.</summary> /// <param name="controllerTypes">The types of the controller.</param> /// <returns>The <see cref="SwaggerService" />.</returns> /// <exception cref="InvalidOperationException">The operation has more than one body parameter.</exception> public SwaggerService GenerateForControllers(IEnumerable <Type> controllerTypes) { var service = CreateDocument(Settings); var schemaResolver = new SchemaResolver(); var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); foreach (var controllerType in controllerTypes) { GenerateForController(service, controllerType, schemaResolver, new SwaggerGenerator(_schemaGenerator, Settings, schemaResolver, schemaDefinitionAppender)); } service.GenerateOperationIds(); foreach (var processor in Settings.DocumentProcessors) { processor.Process(service); } return(service); }
internal string FromAssemblyType(string[] classNames, string settingsData) { var settings = JsonConvert.DeserializeObject <AssemblyTypeToSwaggerGeneratorSettings>(settingsData); RegisterReferencePaths(settings.AllReferencePaths); var service = new SwaggerService(); var generator = new JsonSchemaGenerator(settings); var schemaResolver = new SchemaResolver(); var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, settings.TypeNameGenerator); var assembly = Assembly.LoadFrom(settings.AssemblyPath); foreach (var className in classNames) { var type = assembly.GetType(className); var schema = generator.Generate(type, schemaResolver, schemaDefinitionAppender); service.Definitions[type.Name] = schema; } return(service.ToJson()); }
private JsonSchema4 CreateAndAddSchema(SwaggerService service, Type type, bool mayBeNull, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver) { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } if (IsFileResponse(type)) { return new JsonSchema4 { Type = JsonObjectType.File } } ; var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); if (typeDescription.Type.HasFlag(JsonObjectType.Object) && !typeDescription.IsDictionary) { if (type == typeof(object)) { return(new JsonSchema4 { // IsNullable is directly set on SwaggerParameter or SwaggerResponse Type = Settings.NullHandling == NullHandling.JsonSchema ? JsonObjectType.Object | JsonObjectType.Null : JsonObjectType.Object, AllowAdditionalProperties = false }); } if (!schemaResolver.HasSchema(type, false)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); schemaGenerator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver); } if (mayBeNull) { if (Settings.NullHandling == NullHandling.JsonSchema) { var schema = new JsonSchema4(); schema.OneOf.Add(new JsonSchema4 { Type = JsonObjectType.Null }); schema.OneOf.Add(new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) }); return(schema); } else { // IsNullable is directly set on SwaggerParameter or SwaggerResponse return(new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) }); } } else { return new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) } }; } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new JsonSchema4 { // IsNullable is directly set on SwaggerParameter or SwaggerResponse Type = Settings.NullHandling == NullHandling.JsonSchema ? JsonObjectType.Array | JsonObjectType.Null : JsonObjectType.Array, Item = CreateAndAddSchema(service, itemType, false, null, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); return(generator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver)); } } }
private JsonSchema4 CreateAndAddSchema(SwaggerService service, Type type, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver) { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } if (IsFileResponse(type)) { return new JsonSchema4 { Type = JsonObjectType.File } } ; var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); if (typeDescription.Type.HasFlag(JsonObjectType.Object) && !typeDescription.IsDictionary) { if (type == typeof(object)) { return(new JsonSchema4 { Type = JsonObjectType.Object | JsonObjectType.Null, AllowAdditionalProperties = false }); } if (!schemaResolver.HasSchema(type, false)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); schemaGenerator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver); } return(new JsonSchema4 { Type = JsonObjectType.Object | JsonObjectType.Null, SchemaReference = schemaResolver.GetSchema(type, false) }); } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new JsonSchema4 { Type = JsonObjectType.Array | JsonObjectType.Null, Item = CreateAndAddSchema(service, itemType, null, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); return(generator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver)); } }