Skip to content

Commit 0b141fa

Browse files
committed
Map OpenApiSchema types to simple type and add test to validate
1 parent 83db702 commit 0b141fa

File tree

2 files changed

+73
-8
lines changed

2 files changed

+73
-8
lines changed

src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static class OpenApiTypeMapper
4242
[typeof(DateTimeOffset?)] = () => new OpenApiSchema { Type = "string", Format = "date-time", Nullable = true },
4343
[typeof(Guid?)] = () => new OpenApiSchema { Type = "string", Format = "uuid", Nullable = true },
4444
[typeof(char?)] = () => new OpenApiSchema { Type = "string", Nullable = true },
45-
45+
4646
[typeof(Uri)] = () => new OpenApiSchema { Type = "string" }, // Uri is treated as simple string
4747
[typeof(string)] = () => new OpenApiSchema { Type = "string" },
4848
[typeof(object)] = () => new OpenApiSchema { Type = "object" }
@@ -81,5 +81,50 @@ public static OpenApiSchema MapTypeToOpenApiPrimitiveType(this Type type)
8181
? result()
8282
: new OpenApiSchema { Type = "string" };
8383
}
84+
85+
/// <summary>
86+
/// Maps an OpenAPI data type and format to a simple type.
87+
/// </summary>
88+
/// <param name="schema">The OpenApi data type</param>
89+
/// <returns>The simple type</returns>
90+
/// <exception cref="ArgumentNullException"></exception>
91+
public static Type MapOpenApiPrimitiveTypeToSimpleType(this OpenApiSchema schema)
92+
{
93+
if (schema == null)
94+
{
95+
throw new ArgumentNullException(nameof(schema));
96+
}
97+
98+
var type = (schema.Type, schema.Format, schema.Nullable) switch
99+
{
100+
("boolean", null, false) => typeof(bool),
101+
("integer", "int32", false) => typeof(int),
102+
("integer", "int64", false) => typeof(long),
103+
("number", "float", false) => typeof(float),
104+
("number", "double", false) => typeof(double),
105+
("number", "decimal", false) => typeof(decimal),
106+
("string", "byte", false) => typeof(byte),
107+
("string", "date-time", false) => typeof(DateTimeOffset),
108+
("string", "uuid", false) => typeof(Guid),
109+
("string", "duration", false) => typeof(TimeSpan),
110+
("string", "char", false) => typeof(char),
111+
("string", null, false) => typeof(string),
112+
("object", null, false) => typeof(object),
113+
("string", "uri", false) => typeof(Uri),
114+
("integer", "int32", true) => typeof(int?),
115+
("integer", "int64", true) => typeof(long?),
116+
("number", "float", true) => typeof(float?),
117+
("number", "double", true) => typeof(double?),
118+
("number", "decimal", true) => typeof(decimal?),
119+
("string", "byte", true) => typeof(byte?),
120+
("string", "date-time", true) => typeof(DateTimeOffset?),
121+
("string", "uuid", true) => typeof(Guid?),
122+
("string", "char", true) => typeof(char?),
123+
("boolean", null, true) => typeof(bool?),
124+
_ => typeof(string),
125+
};
126+
127+
return type;
128+
}
84129
}
85130
}

test/Microsoft.OpenApi.Tests/Extensions/OpenApiTypeMapperTests.cs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,24 @@ namespace Microsoft.OpenApi.Tests.Extensions
1212
{
1313
public class OpenApiTypeMapperTests
1414
{
15+
public static IEnumerable<object[]> PrimitiveTypeData => new List<object[]>
16+
{
17+
new object[] { typeof(int), new OpenApiSchema { Type = "integer", Format = "int32" } },
18+
new object[] { typeof(string), new OpenApiSchema { Type = "string" } },
19+
new object[] { typeof(double), new OpenApiSchema { Type = "number", Format = "double" } },
20+
new object[] { typeof(float?), new OpenApiSchema { Type = "number", Format = "float", Nullable = true } },
21+
new object[] { typeof(DateTimeOffset), new OpenApiSchema { Type = "string", Format = "date-time" } }
22+
};
23+
24+
public static IEnumerable<object[]> OpenApiDataTypes => new List<object[]>
25+
{
26+
new object[] { new OpenApiSchema { Type = "integer", Format = "int32"}, typeof(int) },
27+
new object[] { new OpenApiSchema { Type = "string" }, typeof(string) },
28+
new object[] { new OpenApiSchema { Type = "number", Format = "double" }, typeof(double) },
29+
new object[] { new OpenApiSchema { Type = "number", Format = "float", Nullable = true }, typeof(float?) },
30+
new object[] { new OpenApiSchema { Type = "string", Format = "date-time" }, typeof(DateTimeOffset) }
31+
};
32+
1533
[Theory]
1634
[MemberData(nameof(PrimitiveTypeData))]
1735
public void MapTypeToOpenApiPrimitiveTypeShouldSucceed(Type type, OpenApiSchema expected)
@@ -23,13 +41,15 @@ public void MapTypeToOpenApiPrimitiveTypeShouldSucceed(Type type, OpenApiSchema
2341
actual.Should().BeEquivalentTo(expected);
2442
}
2543

26-
public static IEnumerable<object[]> PrimitiveTypeData => new List<object[]>
44+
[Theory]
45+
[MemberData(nameof(OpenApiDataTypes))]
46+
public void MapOpenApiSchemaTypeToSimpleTypeShouldSucceed(OpenApiSchema schema, Type expected)
2747
{
28-
new object[] { typeof(int), new OpenApiSchema { Type = "integer", Format = "int32" } },
29-
new object[] { typeof(string), new OpenApiSchema { Type = "string" } },
30-
new object[] { typeof(double), new OpenApiSchema { Type = "number", Format = "double" } },
31-
new object[] { typeof(float?), new OpenApiSchema { Type = "number", Format = "float", Nullable = true } },
32-
new object[] { typeof(DateTimeOffset), new OpenApiSchema { Type = "string", Format = "date-time" } }
33-
};
48+
// Arrange & Act
49+
var actual = OpenApiTypeMapper.MapOpenApiPrimitiveTypeToSimpleType(schema);
50+
51+
// Assert
52+
actual.Should().Be(expected);
53+
}
3454
}
3555
}

0 commit comments

Comments
 (0)