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);
        }
Exemple #2
0
        private TSchemaType CreateAndAddSchema <TSchemaType>(SwaggerService service, Type type, ISchemaResolver schemaResolver)
            where TSchemaType : JsonSchema4, new()
        {
            if (type.Name == "Task`1")
            {
                type = type.GenericTypeArguments[0];
            }

            if (type.Name == "JsonResult`1")
            {
                type = type.GenericTypeArguments[0];
            }

            if (type.Name == "IHttpActionResult" || type.Name == "HttpResponseMessage" || type.InheritsFrom("HttpResponseMessage"))
            {
                type = typeof(object);
            }

            var info = JsonObjectTypeDescription.FromType(type);

            if (info.Type.HasFlag(JsonObjectType.Object))
            {
                if (type == typeof(object))
                {
                    return(new TSchemaType
                    {
                        Type = JsonObjectType.Object,
                        AllowAdditionalProperties = false
                    });
                }

                if (!schemaResolver.HasSchema(type, false))
                {
                    var schemaGenerator = new RootTypeJsonSchemaGenerator(service, Settings);
                    schemaGenerator.Generate <JsonSchema4>(type, schemaResolver);
                }

                return(new TSchemaType
                {
                    Type = JsonObjectType.Object,
                    SchemaReference = schemaResolver.GetSchema(type, false)
                });
            }

            if (info.Type.HasFlag(JsonObjectType.Array))
            {
                var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0];
                return(new TSchemaType
                {
                    Type = JsonObjectType.Array,
                    Item = CreateAndAddSchema <JsonSchema4>(service, itemType, schemaResolver)
                });
            }

            var generator = new RootTypeJsonSchemaGenerator(service, Settings);

            return(generator.Generate <TSchemaType>(type, schemaResolver));
        }
Exemple #3
0
        private TSchemaType CreateAndAddSchema <TSchemaType>(Type type, ISchemaResolver schemaResolver)
            where TSchemaType : JsonSchema4, new()
        {
            if (type.Name == "Task`1")
            {
                type = type.GenericTypeArguments[0];
            }

            if (type.Name == "JsonResult`1")
            {
                type = type.GenericTypeArguments[0];
            }

            var info = JsonObjectTypeDescription.FromType(type);

            if (info.Type.HasFlag(JsonObjectType.Object))
            {
                if (!schemaResolver.HasSchema(type))
                {
                    var schemaGenerator = new RootTypeJsonSchemaGenerator(_service);
                    schemaGenerator.Generate <JsonSchema4>(type, schemaResolver);
                }

                //load
                //目前先屏蔽处理某些特定类型的异常
                //Dictionary<string,string>
                JsonSchema4 t = null;
                try
                {
                    t = schemaResolver.GetSchema(type);
                }
                catch (Exception)
                {
                }
                return(new TSchemaType
                {
                    Type = JsonObjectType.Object,
                    SchemaReference = t
                });
            }

            if (info.Type.HasFlag(JsonObjectType.Array))
            {
                var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0];
                return(new TSchemaType
                {
                    Type = JsonObjectType.Array,
                    Item = CreateAndAddSchema <JsonSchema4>(itemType, schemaResolver)
                });
            }

            var generator = new RootTypeJsonSchemaGenerator(_service);

            return(generator.Generate <TSchemaType>(type, schemaResolver));
        }
Exemple #4
0
        private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, ParameterInfo parameter, ISchemaResolver schemaResolver)
        {
            var parameterGenerator = new RootTypeJsonSchemaGenerator(service, Settings);

            var info = JsonObjectTypeDescription.FromType(parameter.ParameterType);
            var isComplexParameter = IsComplexType(info);
            var parameterType      = isComplexParameter ? typeof(string) : parameter.ParameterType; // complex types must be treated as string

            var segmentParameter = parameterGenerator.Generate <SwaggerParameter>(parameterType, schemaResolver);

            segmentParameter.Name        = parameter.Name;
            segmentParameter.Description = parameter.GetXmlDocumentation();
            return(segmentParameter);
        }
        private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, string name, string description,
                                                          Type type, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver)
        {
            var parameterGenerator = new RootTypeJsonSchemaGenerator(service, Settings);

            var info          = JsonObjectTypeDescription.FromType(type);
            var parameterType = info.IsComplexType ? typeof(string) : type; // complex types must be treated as string

            var operationParameter = parameterGenerator.Generate <SwaggerParameter>(parameterType, parentAttributes, schemaResolver);

            operationParameter.Name = name;

            if (description != string.Empty)
            {
                operationParameter.Description = description;
            }

            return(operationParameter);
        }
Exemple #6
0
        /// <exception cref="InvalidOperationException">The parameter cannot be an object or array. </exception>
        private SwaggerParameter CreatePrimitiveParameter(ParameterInfo parameter, ISchemaResolver schemaResolver)
        {
            var parameterType = parameter.ParameterType;

            //处理Guid
            if (parameterType == typeof(Guid))
            {
                parameterType = typeof(string);
            }

            var info = JsonObjectTypeDescription.FromType(parameterType);

            if (info.Type.HasFlag(JsonObjectType.Object) || info.Type.HasFlag(JsonObjectType.Array))
            {
                throw new InvalidOperationException("The parameter '" + parameter.Name + "' cannot be an object or array.");
            }

            var parameterGenerator = new RootTypeJsonSchemaGenerator(_service);

            var segmentParameter = parameterGenerator.Generate <SwaggerParameter>(parameter.ParameterType, schemaResolver);

            segmentParameter.Name = parameter.Name;
            return(segmentParameter);
        }
        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));
        }
    }