Skip to content

Commit f3d9676

Browse files
committed
fix: map int types to number OAS type
Signed-off-by: Vincent Biret <[email protected]>
1 parent 1de45c0 commit f3d9676

File tree

4 files changed

+21
-20
lines changed

4 files changed

+21
-20
lines changed

src/Microsoft.OpenApi.Readers/ParseNodes/OpenApiAnyConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny, OpenApiS
157157
}
158158
else
159159
{
160-
if (type == "integer" && format == "int32")
160+
if (type is "integer" or "number" && format == "int32")
161161
{
162162
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
163163
{
164164
return new OpenApiInteger(intValue);
165165
}
166166
}
167167

168-
if (type == "integer" && format == "int64")
168+
if (type is "integer" or "number" && format == "int64")
169169
{
170170
if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var longValue))
171171
{

src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public static class OpenApiTypeMapper
1616
{
1717
[typeof(bool)] = () => new() { Type = "boolean" },
1818
[typeof(byte)] = () => new() { Type = "string", Format = "byte" },
19-
[typeof(int)] = () => new() { Type = "integer", Format = "int32" },
20-
[typeof(uint)] = () => new() { Type = "integer", Format = "int32" },
21-
[typeof(long)] = () => new() { Type = "integer", Format = "int64" },
22-
[typeof(ulong)] = () => new() { Type = "integer", Format = "int64" },
19+
[typeof(int)] = () => new() { Type = "number", Format = "int32" },
20+
[typeof(uint)] = () => new() { Type = "number", Format = "int32" },
21+
[typeof(long)] = () => new() { Type = "number", Format = "int64" },
22+
[typeof(ulong)] = () => new() { Type = "number", Format = "int64" },
2323
[typeof(float)] = () => new() { Type = "number", Format = "float" },
2424
[typeof(double)] = () => new() { Type = "number", Format = "double" },
2525
[typeof(decimal)] = () => new() { Type = "number", Format = "double" },
@@ -31,10 +31,10 @@ public static class OpenApiTypeMapper
3131
// Nullable types
3232
[typeof(bool?)] = () => new() { Type = "boolean", Nullable = true },
3333
[typeof(byte?)] = () => new() { Type = "string", Format = "byte", Nullable = true },
34-
[typeof(int?)] = () => new() { Type = "integer", Format = "int32", Nullable = true },
35-
[typeof(uint?)] = () => new() { Type = "integer", Format = "int32", Nullable = true },
36-
[typeof(long?)] = () => new() { Type = "integer", Format = "int64", Nullable = true },
37-
[typeof(ulong?)] = () => new() { Type = "integer", Format = "int64", Nullable = true },
34+
[typeof(int?)] = () => new() { Type = "number", Format = "int32", Nullable = true },
35+
[typeof(uint?)] = () => new() { Type = "number", Format = "int32", Nullable = true },
36+
[typeof(long?)] = () => new() { Type = "number", Format = "int64", Nullable = true },
37+
[typeof(ulong?)] = () => new() { Type = "number", Format = "int64", Nullable = true },
3838
[typeof(float?)] = () => new() { Type = "number", Format = "float", Nullable = true },
3939
[typeof(double?)] = () => new() { Type = "number", Format = "double", Nullable = true },
4040
[typeof(decimal?)] = () => new() { Type = "number", Format = "double", Nullable = true },
@@ -57,8 +57,8 @@ public static class OpenApiTypeMapper
5757
/// Other types including nullables and URL are also supported.
5858
/// Common Name type format Comments
5959
/// =========== ======= ====== =========================================
60-
/// integer integer int32 signed 32 bits
61-
/// long integer int64 signed 64 bits
60+
/// integer number int32 signed 32 bits
61+
/// long number int64 signed 64 bits
6262
/// float number float
6363
/// double number double
6464
/// string string [empty]
@@ -98,8 +98,8 @@ public static Type MapOpenApiPrimitiveTypeToSimpleType(this OpenApiSchema schema
9898
var type = (schema.Type?.ToLowerInvariant(), schema.Format?.ToLowerInvariant(), schema.Nullable) switch
9999
{
100100
("boolean", null, false) => typeof(bool),
101-
("integer", "int32", false) => typeof(int),
102-
("integer", "int64", false) => typeof(long),
101+
("integer" or "number", "int32", false) => typeof(int),
102+
("integer" or "number", "int64", false) => typeof(long),
103103
("integer", null, false) => typeof(int),
104104
("number", "float", false) => typeof(float),
105105
("number", "double", false) => typeof(double),
@@ -113,8 +113,8 @@ public static Type MapOpenApiPrimitiveTypeToSimpleType(this OpenApiSchema schema
113113
("string", null, false) => typeof(string),
114114
("object", null, false) => typeof(object),
115115
("string", "uri", false) => typeof(Uri),
116-
("integer", "int32", true) => typeof(int?),
117-
("integer", "int64", true) => typeof(long?),
116+
("integer" or "number", "int32", true) => typeof(int?),
117+
("integer" or "number", "int64", true) => typeof(long?),
118118
("integer", null, true) => typeof(int?),
119119
("number", "float", true) => typeof(float?),
120120
("number", "double", true) => typeof(double?),

src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public static void ValidateDataTypeMismatch(
134134
return;
135135
}
136136

137-
if (type == "integer" && format == "int32")
137+
if (type is "integer" or "number" && format == "int32")
138138
{
139139
if (value is not OpenApiInteger)
140140
{
@@ -146,7 +146,7 @@ public static void ValidateDataTypeMismatch(
146146
return;
147147
}
148148

149-
if (type == "integer" && format == "int64")
149+
if (type is "integer" or "number" && format == "int64")
150150
{
151151
if (value is not OpenApiLong)
152152
{
@@ -196,7 +196,7 @@ public static void ValidateDataTypeMismatch(
196196

197197
if (type == "number")
198198
{
199-
if (value is not OpenApiDouble)
199+
if (value is not OpenApiDouble or OpenApiInteger or OpenApiFloat or OpenApiLong)
200200
{
201201
context.CreateWarning(
202202
ruleName,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class OpenApiTypeMapperTests
1414
{
1515
public static IEnumerable<object[]> PrimitiveTypeData => new List<object[]>
1616
{
17-
new object[] { typeof(int), new OpenApiSchema { Type = "integer", Format = "int32" } },
17+
new object[] { typeof(int), new OpenApiSchema { Type = "number", Format = "int32" } },
1818
new object[] { typeof(string), new OpenApiSchema { Type = "string" } },
1919
new object[] { typeof(double), new OpenApiSchema { Type = "number", Format = "double" } },
2020
new object[] { typeof(float?), new OpenApiSchema { Type = "number", Format = "float", Nullable = true } },
@@ -24,6 +24,7 @@ public class OpenApiTypeMapperTests
2424
public static IEnumerable<object[]> OpenApiDataTypes => new List<object[]>
2525
{
2626
new object[] { new OpenApiSchema { Type = "integer", Format = "int32"}, typeof(int) },
27+
new object[] { new OpenApiSchema { Type = "number", Format = "int32"}, typeof(int) },
2728
new object[] { new OpenApiSchema { Type = "integer", Format = null, Nullable = false}, typeof(int) },
2829
new object[] { new OpenApiSchema { Type = "integer", Format = null, Nullable = true}, typeof(int?) },
2930
new object[] { new OpenApiSchema { Type = "string" }, typeof(string) },

0 commit comments

Comments
 (0)