Пример #1
0
        public static SwaggerType GetSwaggerType(Type type)
        {
            var swaggerType = new SwaggerType();

            //Dig until finding a suitable type
            if (RegexRecursiveTypes.IsMatch(type.Name.ToLower()))
            {
                return GetSwaggerType(type.GetGenericArguments().First());
            }

            if (typeof(IEnumerable<object>).IsAssignableFrom(type) || type.IsArray)
            {
                swaggerType.Name = "array";
                Type arrayType;
                if (type.IsGenericType)
                {
                    arrayType = type.GetGenericArguments().First();
                }
                else
                {
                    arrayType = type.GetElementType();

                }
                swaggerType.Items = new ItemInfo { Ref = GetTypeName(arrayType) };
                swaggerType.type = arrayType;
            }
            else
            {
                swaggerType.Name = GetTypeName(type);
                swaggerType.type = type;
            }

            return swaggerType;
        }
Пример #2
0
        public static SwaggerType GetSwaggerType(Type type)
        {
            var swaggerType = new SwaggerType();

            //Dig until finding a suitable type
            if (RegexRecursiveTypes.IsMatch(type.Name.ToLower()))
            {
                return(GetSwaggerType(type.GetGenericArguments().First()));
            }

            if (typeof(IEnumerable <object>).IsAssignableFrom(type) || type.IsArray)
            {
                swaggerType.Name = "array";
                Type arrayType;
                if (type.IsGenericType)
                {
                    arrayType = type.GetGenericArguments().First();
                }
                else
                {
                    arrayType = type.GetElementType();
                }
                swaggerType.Items = new ItemInfo {
                    Ref = GetTypeName(arrayType)
                };
                swaggerType.type = arrayType;
            }
            else
            {
                swaggerType.Name = GetTypeName(type);
                swaggerType.type = type;
            }

            return(swaggerType);
        }
Пример #3
0
        /// <summary>
        /// Creates an api operation
        /// </summary>
        /// <param name="api">Description of the api via the ApiExplorer</param>
        /// <param name="docProvider">Access to the XML docs written in code</param>
        /// <returns>An api operation</returns>
        public static ResourceApiOperation CreateResourceApiOperation(ApiDescription api, XmlCommentDocumentationProvider docProvider)
        {
            ResponseMeta responseMeta = docProvider.GetResponseType(api.ActionDescriptor);
            SwaggerType  swaggerType  = Helper.GetSwaggerType(responseMeta.Type);


            ResourceApiOperation rApiOperation = new ResourceApiOperation
            {
                httpMethod       = api.HttpMethod.ToString(),
                nickname         = docProvider.GetNickname(api.ActionDescriptor),
                items            = swaggerType.Items,
                type             = swaggerType.Name,
                summary          = api.Documentation,
                notes            = docProvider.GetNotes(api.ActionDescriptor),
                parameters       = new List <ResourceApiOperationParameter>(),
                responseMessages = docProvider.GetResponseCodes(api.ActionDescriptor)
            };

            var typesToReturn = new ConcurrentDictionary <string, string>();

            Helper.TryToAddModels(models, responseMeta.Type, docProvider, typesToReturn);
            return(rApiOperation);
        }
Пример #4
0
        public static void TryToAddModels(ConcurrentDictionary <string, TypeInfo> models, Type type, XmlCommentDocumentationProvider docProvider, ConcurrentDictionary <string, string> typesToReturn = null, int level = 0)
        {
            var _type = type;

            if (type.IsArray)
            {
                _type = type.GetElementType();
            }
            else if (type.IsGenericType)
            {
                _type = type.GetGenericArguments().First();
            }

            string typeName = GetTypeName(_type);

            if (models.Any(m => m.Key == typeName))
            {
                return;
            }

            if (IsOutputable(_type))
            {
                var typeInfo = new TypeInfo {
                    id = typeName
                };
                if (!IgnoreTypes.Contains(_type.Name.ToLower()))
                {
                    typeInfo.description = docProvider.GetSummary(_type);
                }
                //Ignore properties for .net types
                if (!_type.Assembly.FullName.Contains("System") && !_type.Assembly.FullName.Contains("mscorlib"))
                {
                    var modelInfoDic = new Dictionary <string, PropInfo>();
                    foreach (var propertyInfo in _type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
                    {
                        if (propertyInfo.GetCustomAttributes(typeof(JsonIgnoreAttribute), false).FirstOrDefault() != null)
                        {
                            continue;
                        }

                        var propInfo = new PropInfo();

                        string      propName    = GetPropertyName(propertyInfo);
                        Type        propType    = docProvider.GetType(propertyInfo);
                        SwaggerType swaggerType = GetSwaggerType(propType);
                        propInfo.type     = swaggerType.Name;
                        propInfo.items    = swaggerType.Items;
                        propInfo.required = IsRequired(propertyInfo, docProvider);


                        if (!modelInfoDic.Keys.Contains(propName))
                        {
                            modelInfoDic.Add(propName, propInfo);
                        }

                        if (!IgnoreTypes.Contains(propInfo.type))
                        {
                            propInfo.description = docProvider.GetSummary(propertyInfo);
                            if (propertyInfo.PropertyType.IsEnum)
                            {
                                modelInfoDic[propName].@enum = propertyInfo.PropertyType.GetEnumNames();
                            }
                            //Don't go too deep
                            if (level < 10)
                            {
                                TryToAddModels(models, swaggerType.type, docProvider, typesToReturn, ++level);
                            }
                        }
                    }
                    typeInfo.properties = modelInfoDic;
                }
                if (_type.IsEnum)
                {
                    typeInfo.values = _type.GetEnumNames();
                }

                models.TryAdd(typeName, typeInfo);
            }
        }