示例#1
0
        /// <summary>
        /// Converts <see cref="OpenApiParameterAttribute"/> to <see cref="OpenApiParameter"/>.
        /// </summary>
        /// <param name="attribute"><see cref="OpenApiParameterAttribute"/> instance.</param>
        /// <returns><see cref="OpenApiParameter"/> instance.</returns>
        public static OpenApiParameter ToOpenApiParameter(this OpenApiParameterAttribute attribute)
        {
            attribute.ThrowIfNullOrDefault();

            var typeCode = Type.GetTypeCode(attribute.Type);
            var schema   = new OpenApiSchema()
            {
                Type   = typeCode.ToDataType(),
                Format = typeCode.ToDataFormat()
            };
            var parameter = new OpenApiParameter()
            {
                Name        = attribute.Name,
                Description = attribute.Description,
                Required    = attribute.Required,
                In          = attribute.In,
                Schema      = schema
            };

            if (!string.IsNullOrWhiteSpace(attribute.Summary))
            {
                var summary = new OpenApiString(attribute.Summary);

                parameter.Extensions.Add("x-ms-summary", summary);
            }

            if (attribute.Visibility != OpenApiVisibilityType.Undefined)
            {
                var visibility = new OpenApiString(attribute.Visibility.ToDisplayName());

                parameter.Extensions.Add("x-ms-visibility", visibility);
            }

            return(parameter);
        }
        public void Given_Value_With_Visibility_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result(OpenApiVisibilityType?visibility)
        {
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(long),
                Summary     = "lorem ipsum",
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Path,
            };

            if (visibility.HasValue)
            {
                attribute.Visibility = visibility.Value;
            }

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute);

            if (visibility.HasValue)
            {
                result.Extensions.Keys.Should().Contain("x-ms-visibility");
                result.Extensions["x-ms-visibility"].Should().BeOfType <OpenApiString>();
                (result.Extensions["x-ms-visibility"] as OpenApiString).Value.Should().Be(attribute.Visibility.ToDisplayName());
            }
            else
            {
                result.Extensions.Keys.Should().NotContain("x-ms-visibility");
            }
        }
示例#3
0
        public void Given_Properties_When_Instantiated_It_Should_Return_Value(
            string summary, string description, Type type, ParameterLocation @in,
            OpenApiParameterCollectionDelimiterType delimiter, bool explode, bool required, OpenApiVisibilityType visibility, bool deprecated)
        {
            var attribute = new OpenApiParameterAttribute("Name")
            {
                Summary             = summary,
                Description         = description,
                Type                = type,
                In                  = @in,
                CollectionDelimiter = delimiter,
                Explode             = explode,
                Required            = required,
                Visibility          = visibility,
                Deprecated          = deprecated,
            };

            attribute.Summary.Should().Be(summary);
            attribute.Description.Should().Be(description);
            attribute.Type.Should().Be(type);
            attribute.In.Should().Be(@in);
            attribute.CollectionDelimiter.Should().Be(delimiter);
            attribute.Explode.Should().Be(explode);
            attribute.Required.Should().Be(required);
            attribute.Visibility.Should().Be(visibility);
            attribute.Deprecated.Should().Be(deprecated);
        }
示例#4
0
        public void Given_Value_Property_Should_Return_Value()
        {
            var name      = "Hello World";
            var attribute = new OpenApiParameterAttribute(name);

            attribute.Name.Should().BeEquivalentTo(name);
            attribute.Summary.Should().BeNullOrWhiteSpace();
            attribute.Description.Should().BeNullOrWhiteSpace();
            attribute.Type.Should().Be <string>();
            attribute.In.Should().Be(ParameterLocation.Path);
            attribute.Required.Should().Be(false);
            attribute.Visibility.Should().Be(OpenApiVisibilityType.Undefined);
        }
示例#5
0
        public void Given_Value_With_Long_Type_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result()
        {
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(long),
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Path
            };

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute);

            result.Schema.Type.Should().Be("integer");
            result.Schema.Format.Should().Be("int64");
        }
示例#6
0
        public void Given_Parameter_When_Instantiated_It_Should_Return_Value(string name)
        {
            var attribute = new OpenApiParameterAttribute(name);

            attribute.Name.Should().BeEquivalentTo(name);
            attribute.Summary.Should().BeNullOrWhiteSpace();
            attribute.Description.Should().BeNullOrWhiteSpace();
            attribute.Type.Should().Be <string>();
            attribute.In.Should().Be(ParameterLocation.Path);
            attribute.CollectionDelimiter.Should().Be(OpenApiParameterCollectionDelimiterType.Comma);
            attribute.Explode.Should().BeFalse();
            attribute.Required.Should().BeFalse();
            attribute.Visibility.Should().Be(OpenApiVisibilityType.Undefined);
            attribute.Deprecated.Should().BeFalse();
        }
示例#7
0
        public void Given_Value_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result()
        {
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(string),
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Path
            };

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute);

            result.Name.Should().Be(attribute.Name);
            result.Description.Should().Be(attribute.Description);
            result.Required.Should().Be(attribute.Required);
            result.In.Should().Be(attribute.In);
        }
示例#8
0
        public void Given_Value_With_Summary_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result()
        {
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(long),
                Summary     = "lorem ipsum",
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Path
            };

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute);

            result.Extensions.Keys.Should().Contain("x-ms-summary");
            result.Extensions["x-ms-summary"].Should().BeOfType <OpenApiString>();
            (result.Extensions["x-ms-summary"] as OpenApiString).Value.Should().Be(attribute.Summary);
        }
        public void Given_Value_With_Deprecated_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result(bool?deprecated)
        {
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(long),
                Summary     = "lorem ipsum",
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Path,
            };

            if (deprecated.HasValue)
            {
                attribute.Deprecated = deprecated.Value;
            }

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute);

            result.Deprecated.Should().Be(deprecated.GetValueOrDefault());
        }
示例#10
0
        public void Given_Value_With_List_Enum_Type_When_ToOpenApiParameter_Invoked_Then_It_Should_Return_Result()
        {
            var strategy  = new CamelCaseNamingStrategy();
            var names     = typeof(FakeEnum).ToOpenApiStringCollection(strategy).Select(p => (p as OpenApiString).Value).ToList();
            var attribute = new OpenApiParameterAttribute("hello")
            {
                Type        = typeof(List <FakeEnum>),
                Description = "hello world",
                Required    = true,
                In          = ParameterLocation.Query
            };

            var result = OpenApiParameterAttributeExtensions.ToOpenApiParameter(attribute, strategy);

            result.Style.Should().Be(ParameterStyle.Form);
            result.Explode.Should().Be(attribute.Explode);

            result.Schema.Type.Should().Be("array");
            result.Schema.Format.Should().BeNull();
            result.Schema.Items.Type.Should().Be("string");
            result.Schema.Items.Enum.Should().HaveCount(names.Count);
            (result.Schema.Items.Default as OpenApiString).Value.Should().Be(names.First());
        }
示例#11
0
        /// <summary>
        /// Initializes a new instance of the <see cref="OpenApiServiceOperation"/> class.
        /// </summary>
        /// <param name="service">The service hosting the operation.</param>
        /// <param name="operation">The operation.</param>
        /// <param name="configuration">The OpenAPI configuration.</param>
        public OpenApiServiceOperation(IOpenApiService service, MethodInfo operation, IOpenApiConfiguration configuration)
        {
            this.service       = service ?? throw new ArgumentNullException(nameof(service));
            this.operation     = operation ?? throw new ArgumentNullException(nameof(operation));
            this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            ParameterInfo[] parameters = this.operation.GetParameters();
            this.defaultValues    = new object[parameters.Length];
            this.hasDefaultValues = new bool[parameters.Length];
            this.parameterNames   = new string[parameters.Length];

            for (int i = 0; i < parameters.Length; ++i)
            {
                ParameterInfo parameter = parameters[i];

                if (parameter.HasDefaultValue)
                {
                    this.hasDefaultValues[i] = true;
                    this.defaultValues[i]    = parameter.DefaultValue;
                }

                OpenApiParameterAttribute parameterAttribute = parameter.GetCustomAttribute <OpenApiParameterAttribute>();
                this.parameterNames[i] = parameterAttribute?.ParameterName ?? parameter.Name;
            }
        }
示例#12
0
        /// <summary>
        /// Converts <see cref="OpenApiParameterAttribute"/> to <see cref="OpenApiParameter"/>.
        /// </summary>
        /// <param name="attribute"><see cref="OpenApiParameterAttribute"/> instance.</param>
        /// <param name="namingStrategy"><see cref="NamingStrategy"/> instance.</param>
        /// <param name="collection"><see cref="VisitorCollection"/> instance.</param>
        /// <returns><see cref="OpenApiParameter"/> instance.</returns>
        public static OpenApiParameter ToOpenApiParameter(this OpenApiParameterAttribute attribute, NamingStrategy namingStrategy = null, VisitorCollection collection = null)
        {
            attribute.ThrowIfNullOrDefault();

            if (namingStrategy.IsNullOrDefault())
            {
                namingStrategy = new DefaultNamingStrategy();
            }

            if (collection.IsNullOrDefault())
            {
                collection = VisitorCollection.CreateInstance();
            }

            var type = attribute.Type;

            var schema = collection.ParameterVisit(type, namingStrategy);

            var parameter = new OpenApiParameter()
            {
                Name        = attribute.Name,
                Description = attribute.Description,
                Required    = attribute.Required,
                In          = attribute.In,
                Schema      = schema
            };

            if (type.IsOpenApiArray())
            {
                if (attribute.In == ParameterLocation.Path)
                {
                    parameter.Style   = ParameterStyle.Simple;
                    parameter.Explode = false;
                }

                if (attribute.In == ParameterLocation.Query)
                {
                    parameter.Style = attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Comma
                                      ? ParameterStyle.Form
                                      : (attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Space
                                         ? ParameterStyle.SpaceDelimited
                                         : ParameterStyle.PipeDelimited);
                    parameter.Explode = attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Comma
                                        ? attribute.Explode
                                        : false;
                }
            }

            if (!string.IsNullOrWhiteSpace(attribute.Summary))
            {
                var summary = new OpenApiString(attribute.Summary);

                parameter.Extensions.Add("x-ms-summary", summary);
            }

            if (attribute.Visibility != OpenApiVisibilityType.Undefined)
            {
                var visibility = new OpenApiString(attribute.Visibility.ToDisplayName());

                parameter.Extensions.Add("x-ms-visibility", visibility);
            }

            return(parameter);
        }
        /// <summary>
        /// Converts <see cref="OpenApiParameterAttribute"/> to <see cref="OpenApiParameter"/>.
        /// </summary>
        /// <param name="attribute"><see cref="OpenApiParameterAttribute"/> instance.</param>
        /// <param name="namingStrategy"></param>
        /// <returns><see cref="OpenApiParameter"/> instance.</returns>
        public static OpenApiParameter ToOpenApiParameter(this OpenApiParameterAttribute attribute, NamingStrategy namingStrategy = null)
        {
            attribute.ThrowIfNullOrDefault();

            var type = attribute.Type;

            var schema = new OpenApiSchema()
            {
                Type   = type.ToDataType(),
                Format = type.ToDataFormat(),
            };

            if (type.IsOpenApiArray())
            {
                schema.Type   = "array";
                schema.Format = null;
                schema.Items  = (type.GetElementType() ?? type.GetGenericArguments()[0]).ToOpenApiSchema(namingStrategy);
            }

            if (type.IsUnflaggedEnumType())
            {
                var converterAttribute = type.GetCustomAttribute <JsonConverterAttribute>();
                if (!converterAttribute.IsNullOrDefault() &&
                    typeof(StringEnumConverter).IsAssignableFrom(converterAttribute.ConverterType))
                {
                    var enums = type.ToOpenApiStringCollection(namingStrategy);

                    schema.Type    = "string";
                    schema.Format  = null;
                    schema.Enum    = enums;
                    schema.Default = enums.First();
                }
                else
                {
                    var enums = type.ToOpenApiIntegerCollection();

                    schema.Enum    = enums;
                    schema.Default = enums.First();
                }
            }

            var parameter = new OpenApiParameter()
            {
                Name        = attribute.Name,
                Description = attribute.Description,
                Required    = attribute.Required,
                In          = attribute.In,
                Schema      = schema
            };

            if (type.IsOpenApiArray())
            {
                if (attribute.In == ParameterLocation.Path)
                {
                    parameter.Style   = ParameterStyle.Simple;
                    parameter.Explode = false;
                }

                if (attribute.In == ParameterLocation.Query)
                {
                    parameter.Style = attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Comma
                                      ? ParameterStyle.Form
                                      : (attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Space
                                         ? ParameterStyle.SpaceDelimited
                                         : ParameterStyle.PipeDelimited);
                    parameter.Explode = attribute.CollectionDelimiter == OpenApiParameterCollectionDelimiterType.Comma
                                        ? attribute.Explode
                                        : false;
                }
            }

            if (!string.IsNullOrWhiteSpace(attribute.Summary))
            {
                var summary = new OpenApiString(attribute.Summary);

                parameter.Extensions.Add("x-ms-summary", summary);
            }

            if (attribute.Visibility != OpenApiVisibilityType.Undefined)
            {
                var visibility = new OpenApiString(attribute.Visibility.ToDisplayName());

                parameter.Extensions.Add("x-ms-visibility", visibility);
            }

            return(parameter);
        }