diff --git a/src/DotSwashbuckle.AspNetCore.Newtonsoft/SchemaGenerator/NewtonsoftDataContractResolver.cs b/src/DotSwashbuckle.AspNetCore.Newtonsoft/SchemaGenerator/NewtonsoftDataContractResolver.cs index 1b4ac8693b..3c2830de09 100644 --- a/src/DotSwashbuckle.AspNetCore.Newtonsoft/SchemaGenerator/NewtonsoftDataContractResolver.cs +++ b/src/DotSwashbuckle.AspNetCore.Newtonsoft/SchemaGenerator/NewtonsoftDataContractResolver.cs @@ -33,7 +33,7 @@ public DataContract GetDataContractForType(Type type) if (jsonContract is JsonPrimitiveContract && !jsonContract.UnderlyingType.IsEnum) { - var primitiveTypeAndFormat = PrimitiveTypesAndFormats.TryGetValue(jsonContract.UnderlyingType, out var format) + var primitiveTypeAndFormat = CommonFormats.PrimitiveTypesAndFormats.TryGetValue(jsonContract.UnderlyingType, out var format) ? format : Tuple.Create(DataType.String, (string)null); @@ -53,8 +53,8 @@ public DataContract GetDataContractForType(Type type) && JsonConverterFunc(enumValues.GetValue(0)).StartsWith("\""); var primitiveTypeAndFormat = serializeAsString - ? PrimitiveTypesAndFormats[typeof(string)] - : PrimitiveTypesAndFormats[jsonContract.UnderlyingType.GetEnumUnderlyingType()]; + ? CommonFormats.PrimitiveTypesAndFormats[typeof(string)] + : CommonFormats.PrimitiveTypesAndFormats[jsonContract.UnderlyingType.GetEnumUnderlyingType()]; return DataContract.ForPrimitive( underlyingType: jsonContract.UnderlyingType, @@ -183,50 +183,5 @@ private IEnumerable GetDataPropertiesFor(JsonObjectContract jsonOb return dataProperties; } - - private static readonly Dictionary> PrimitiveTypesAndFormats = new Dictionary> - { - [typeof(bool)] = Tuple.Create(DataType.Boolean, (string)null), - [typeof(bool?)] = Tuple.Create(DataType.Boolean, (string)null), - [typeof(byte)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(byte?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(sbyte)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(sbyte?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(short)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(short?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(ushort)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(ushort?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(int)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(int?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(uint)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(uint?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(long)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(long?)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(ulong)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(ulong?)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(float)] = Tuple.Create(DataType.Number, "float"), - [typeof(float?)] = Tuple.Create(DataType.Number, "float"), - [typeof(double)] = Tuple.Create(DataType.Number, "double"), - [typeof(double?)] = Tuple.Create(DataType.Number, "double"), - [typeof(decimal)] = Tuple.Create(DataType.Number, "double"), - [typeof(decimal?)] = Tuple.Create(DataType.Number, "double"), - [typeof(byte[])] = Tuple.Create(DataType.String, "byte"), - [typeof(string)] = Tuple.Create(DataType.String, (string)null), - [typeof(char)] = Tuple.Create(DataType.String, (string)null), - [typeof(char?)] = Tuple.Create(DataType.String, (string)null), - [typeof(DateTime)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTime?)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTimeOffset)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTimeOffset?)] = Tuple.Create(DataType.String, "date-time"), - [typeof(Guid)] = Tuple.Create(DataType.String, "uuid"), - [typeof(Guid?)] = Tuple.Create(DataType.String, "uuid"), - [typeof(Uri)] = Tuple.Create(DataType.String, "uri"), - [typeof(TimeSpan)] = Tuple.Create(DataType.String, "date-span"), - [typeof(TimeSpan?)] = Tuple.Create(DataType.String, "date-span"), - [typeof(DateOnly)] = Tuple.Create(DataType.String, "date"), - [typeof(DateOnly?)] = Tuple.Create(DataType.String, "date"), - [typeof(TimeOnly)] = Tuple.Create(DataType.String, "time"), - [typeof(TimeOnly?)] = Tuple.Create(DataType.String, "time") - }; } } diff --git a/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs b/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs index b7080cd3a3..941193c0fa 100644 --- a/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs +++ b/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs @@ -26,7 +26,7 @@ public DataContract GetDataContractForType(Type type) jsonConverter: JsonConverterFunc); } - if (PrimitiveTypesAndFormats.TryGetValue(type, out var primitiveTypeAndFormat1)) + if (CommonFormats.PrimitiveTypesAndFormats.TryGetValue(type, out var primitiveTypeAndFormat1)) { return DataContract.ForPrimitive( underlyingType: type, @@ -44,8 +44,8 @@ public DataContract GetDataContractForType(Type type) && JsonConverterFunc(enumValues.GetValue(0)).StartsWith("\""); var primitiveTypeAndFormat = serializeAsString - ? PrimitiveTypesAndFormats[typeof(string)] - : PrimitiveTypesAndFormats[type.GetEnumUnderlyingType()]; + ? CommonFormats.PrimitiveTypesAndFormats[typeof(string)] + : CommonFormats.PrimitiveTypesAndFormats[type.GetEnumUnderlyingType()]; return DataContract.ForPrimitive( underlyingType: type, @@ -211,48 +211,5 @@ private IEnumerable GetDataPropertiesFor(Type objectType, out Type return dataProperties; } - - private static readonly Dictionary> PrimitiveTypesAndFormats = new Dictionary> - { - [typeof(bool)] = Tuple.Create(DataType.Boolean, (string)null), - [typeof(bool?)] = Tuple.Create(DataType.Boolean, (string)null), - [typeof(byte)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(byte?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(sbyte)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(sbyte?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(short)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(short?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(ushort)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(ushort?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(int)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(int?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(uint)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(uint?)] = Tuple.Create(DataType.Integer, "int32"), - [typeof(long)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(long?)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(ulong)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(ulong?)] = Tuple.Create(DataType.Integer, "int64"), - [typeof(float)] = Tuple.Create(DataType.Number, "float"), - [typeof(float?)] = Tuple.Create(DataType.Number, "float"), - [typeof(double)] = Tuple.Create(DataType.Number, "double"), - [typeof(double?)] = Tuple.Create(DataType.Number, "double"), - [typeof(decimal)] = Tuple.Create(DataType.Number, "double"), - [typeof(decimal?)] = Tuple.Create(DataType.Number, "double"), - [typeof(byte[])] = Tuple.Create(DataType.String, "byte"), - [typeof(string)] = Tuple.Create(DataType.String, (string)null), - [typeof(char)] = Tuple.Create(DataType.String, (string)null), - [typeof(char?)] = Tuple.Create(DataType.String, (string)null), - [typeof(DateTime)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTime?)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTimeOffset)] = Tuple.Create(DataType.String, "date-time"), - [typeof(DateTimeOffset?)] = Tuple.Create(DataType.String, "date-time"), - [typeof(Guid)] = Tuple.Create(DataType.String, "uuid"), - [typeof(Guid?)] = Tuple.Create(DataType.String, "uuid"), - [typeof(Uri)] = Tuple.Create(DataType.String, "uri"), - [typeof(DateOnly)] = Tuple.Create(DataType.String, "date"), - [typeof(DateOnly?)] = Tuple.Create(DataType.String, "date"), - [typeof(TimeOnly)] = Tuple.Create(DataType.String, "time"), - [typeof(TimeOnly?)] = Tuple.Create(DataType.String, "time") - }; } } diff --git a/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/PrimitiveTypesAndFormats.cs b/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/PrimitiveTypesAndFormats.cs new file mode 100644 index 0000000000..7611f8d41f --- /dev/null +++ b/src/DotSwashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/PrimitiveTypesAndFormats.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace DotSwashbuckle.AspNetCore.SwaggerGen +{ + public static class CommonFormats + { + public static readonly IReadOnlyDictionary> PrimitiveTypesAndFormats = new Dictionary> + { + [typeof(bool)] = Tuple.Create(DataType.Boolean, (string)null), + [typeof(bool?)] = Tuple.Create(DataType.Boolean, (string)null), + [typeof(byte)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(byte?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(sbyte)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(sbyte?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(short)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(short?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(ushort)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(ushort?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(int)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(int?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(uint)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(uint?)] = Tuple.Create(DataType.Integer, "int32"), + [typeof(long)] = Tuple.Create(DataType.Integer, "int64"), + [typeof(long?)] = Tuple.Create(DataType.Integer, "int64"), + [typeof(ulong)] = Tuple.Create(DataType.Integer, "int64"), + [typeof(ulong?)] = Tuple.Create(DataType.Integer, "int64"), + [typeof(Int128)] = Tuple.Create(DataType.Integer, "int128"), + [typeof(Int128?)] = Tuple.Create(DataType.Integer, "int128"), + [typeof(UInt128)] = Tuple.Create(DataType.Integer, "int128"), + [typeof(UInt128?)] = Tuple.Create(DataType.Integer, "int128"), + [typeof(Version)] = Tuple.Create(DataType.String, (string)null), + [typeof(float)] = Tuple.Create(DataType.Number, "float"), + [typeof(float?)] = Tuple.Create(DataType.Number, "float"), + [typeof(double)] = Tuple.Create(DataType.Number, "double"), + [typeof(double?)] = Tuple.Create(DataType.Number, "double"), + [typeof(decimal)] = Tuple.Create(DataType.Number, "double"), + [typeof(decimal?)] = Tuple.Create(DataType.Number, "double"), + [typeof(byte[])] = Tuple.Create(DataType.String, "byte"), + [typeof(string)] = Tuple.Create(DataType.String, (string)null), + [typeof(char)] = Tuple.Create(DataType.String, (string)null), + [typeof(char?)] = Tuple.Create(DataType.String, (string)null), + [typeof(DateTime)] = Tuple.Create(DataType.String, "date-time"), + [typeof(DateTime?)] = Tuple.Create(DataType.String, "date-time"), + [typeof(DateTimeOffset)] = Tuple.Create(DataType.String, "date-time"), + [typeof(DateTimeOffset?)] = Tuple.Create(DataType.String, "date-time"), + [typeof(Guid)] = Tuple.Create(DataType.String, "uuid"), + [typeof(Guid?)] = Tuple.Create(DataType.String, "uuid"), + [typeof(Uri)] = Tuple.Create(DataType.String, "uri"), + [typeof(TimeSpan)] = Tuple.Create(DataType.String, "date-span"), + [typeof(TimeSpan?)] = Tuple.Create(DataType.String, "date-span"), + [typeof(DateOnly)] = Tuple.Create(DataType.String, "date"), + [typeof(DateOnly?)] = Tuple.Create(DataType.String, "date"), + [typeof(TimeOnly)] = Tuple.Create(DataType.String, "time"), + [typeof(TimeOnly?)] = Tuple.Create(DataType.String, "time") + }; + } +} diff --git a/test/DotSwashbuckle.AspNetCore.Newtonsoft.Test/SchemaGenerator/NewtonsoftSchemaGeneratorTests.cs b/test/DotSwashbuckle.AspNetCore.Newtonsoft.Test/SchemaGenerator/NewtonsoftSchemaGeneratorTests.cs index 64d3da6a76..8259a0165e 100644 --- a/test/DotSwashbuckle.AspNetCore.Newtonsoft.Test/SchemaGenerator/NewtonsoftSchemaGeneratorTests.cs +++ b/test/DotSwashbuckle.AspNetCore.Newtonsoft.Test/SchemaGenerator/NewtonsoftSchemaGeneratorTests.cs @@ -53,6 +53,8 @@ public void GenerateSchema_GeneratesFileSchema_IfFormFileOrFileResultType(Type t [InlineData(typeof(float), "number", "float", false)] [InlineData(typeof(double), "number", "double", false)] [InlineData(typeof(decimal), "number", "double", false)] + [InlineData(typeof(Int128), "integer", "int128", false)] + [InlineData(typeof(UInt128), "integer", "int128", false)] [InlineData(typeof(string), "string", null, false)] [InlineData(typeof(char), "string", null, false)] [InlineData(typeof(byte[]), "string", "byte", false)] @@ -63,6 +65,8 @@ public void GenerateSchema_GeneratesFileSchema_IfFormFileOrFileResultType(Type t [InlineData(typeof(Version), "string", null, false)] [InlineData(typeof(bool?), "boolean", null, true)] [InlineData(typeof(int?), "integer", "int32", true)] + [InlineData(typeof(Int128?), "integer", "int128", true)] + [InlineData(typeof(UInt128?), "integer", "int128", true)] [InlineData(typeof(DateTime?), "string", "date-time", true)] public void GenerateSchema_GeneratesPrimitiveSchema_IfPrimitiveOrNullablePrimitiveType( Type type, diff --git a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs index c622453717..654af0fb8a 100644 --- a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs +++ b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs @@ -44,42 +44,44 @@ public void GenerateSchema_GeneratesFileSchema_IfFormFileOrFileResultType(Type t } [Theory] - [InlineData(typeof(bool), "boolean", null)] - [InlineData(typeof(byte), "integer", "int32")] - [InlineData(typeof(sbyte), "integer", "int32")] - [InlineData(typeof(short), "integer", "int32")] - [InlineData(typeof(ushort), "integer", "int32")] - [InlineData(typeof(int), "integer", "int32")] - [InlineData(typeof(uint), "integer", "int32")] - [InlineData(typeof(long), "integer", "int64")] - [InlineData(typeof(ulong), "integer", "int64")] - [InlineData(typeof(float), "number", "float")] - [InlineData(typeof(double), "number", "double")] - [InlineData(typeof(decimal), "number", "double")] - [InlineData(typeof(string), "string", null)] - [InlineData(typeof(char), "string", null)] - [InlineData(typeof(byte[]), "string", "byte")] - [InlineData(typeof(DateTime), "string", "date-time")] - [InlineData(typeof(DateTimeOffset), "string", "date-time")] - [InlineData(typeof(Guid), "string", "uuid")] - [InlineData(typeof(Uri), "string", "uri")] - [InlineData(typeof(DateOnly), "string", "date")] - [InlineData(typeof(TimeOnly), "string", "time")] - [InlineData(typeof(bool?), "boolean", null)] - [InlineData(typeof(int?), "integer", "int32")] - [InlineData(typeof(DateTime?), "string", "date-time")] - [InlineData(typeof(Guid?), "string", "uuid")] - [InlineData(typeof(DateOnly?), "string", "date")] - [InlineData(typeof(TimeOnly?), "string", "time")] + [InlineData(typeof(byte), "integer", "int32", false)] + [InlineData(typeof(sbyte), "integer", "int32", false)] + [InlineData(typeof(short), "integer", "int32", false)] + [InlineData(typeof(ushort), "integer", "int32", false)] + [InlineData(typeof(int), "integer", "int32", false)] + [InlineData(typeof(uint), "integer", "int32", false)] + [InlineData(typeof(long), "integer", "int64", false)] + [InlineData(typeof(ulong), "integer", "int64", false)] + [InlineData(typeof(float), "number", "float", false)] + [InlineData(typeof(double), "number", "double", false)] + [InlineData(typeof(decimal), "number", "double", false)] + [InlineData(typeof(Int128), "integer", "int128", false)] + [InlineData(typeof(UInt128), "integer", "int128", false)] + [InlineData(typeof(string), "string", null, false)] + [InlineData(typeof(char), "string", null, false)] + [InlineData(typeof(byte[]), "string", "byte", false)] + [InlineData(typeof(DateTime), "string", "date-time", false)] + [InlineData(typeof(DateTimeOffset), "string", "date-time", false)] + [InlineData(typeof(Guid), "string", "uuid", false)] + [InlineData(typeof(TimeSpan), "string", "date-span", false)] + [InlineData(typeof(Version), "string", null, false)] + [InlineData(typeof(bool?), "boolean", null, true)] + [InlineData(typeof(int?), "integer", "int32", true)] + [InlineData(typeof(Int128?), "integer", "int128", true)] + [InlineData(typeof(UInt128?), "integer", "int128", true)] + [InlineData(typeof(DateTime?), "string", "date-time", true)] public void GenerateSchema_GeneratesPrimitiveSchema_IfPrimitiveOrNullablePrimitiveType( Type type, string expectedSchemaType, - string expectedFormat) + string expectedFormat, + bool expectedNullable + ) { var schema = Subject().GenerateSchema(type, new SchemaRepository()); Assert.Equal(expectedSchemaType, schema.Type); Assert.Equal(expectedFormat, schema.Format); + Assert.Equal(expectedNullable, schema.Nullable); } [Theory]