/// <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"); } }
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); }
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); }
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"); }
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(); }
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); }
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()); }
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()); }
/// <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; } }
/// <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); }