@@ -83,47 +83,58 @@ internal sealed partial class OpenApiJsonSchema
8383 }
8484
8585 internal static IOpenApiAny ? ReadOpenApiAny ( ref Utf8JsonReader reader )
86+ => ReadOpenApiAny ( ref reader , out _ ) ;
87+
88+ internal static IOpenApiAny ? ReadOpenApiAny ( ref Utf8JsonReader reader , out string ? type )
8689 {
90+ type = null ;
8791 if ( reader . TokenType == JsonTokenType . Null )
8892 {
8993 return new OpenApiNull ( ) ;
9094 }
9195
9296 if ( reader . TokenType == JsonTokenType . True || reader . TokenType == JsonTokenType . False )
9397 {
98+ type = "boolean" ;
9499 return new OpenApiBoolean ( reader . GetBoolean ( ) ) ;
95100 }
96101
97102 if ( reader . TokenType == JsonTokenType . Number )
98103 {
99104 if ( reader . TryGetInt32 ( out var intValue ) )
100105 {
106+ type = "integer" ;
101107 return new OpenApiInteger ( intValue ) ;
102108 }
103109
104110 if ( reader . TryGetInt64 ( out var longValue ) )
105111 {
112+ type = "integer" ;
106113 return new OpenApiLong ( longValue ) ;
107114 }
108115
109116 if ( reader . TryGetSingle ( out var floatValue ) && ! float . IsInfinity ( floatValue ) )
110117 {
118+ type = "number" ;
111119 return new OpenApiFloat ( floatValue ) ;
112120 }
113121
114122 if ( reader . TryGetDouble ( out var doubleValue ) )
115123 {
124+ type = "number" ;
116125 return new OpenApiDouble ( doubleValue ) ;
117126 }
118127 }
119128
120129 if ( reader . TokenType == JsonTokenType . String )
121130 {
131+ type = "string" ;
122132 return new OpenApiString ( reader . GetString ( ) ) ;
123133 }
124134
125135 if ( reader . TokenType == JsonTokenType . StartArray )
126136 {
137+ type = "array" ;
127138 var array = new OpenApiArray ( ) ;
128139 while ( reader . TokenType != JsonTokenType . EndArray )
129140 {
@@ -135,6 +146,7 @@ internal sealed partial class OpenApiJsonSchema
135146
136147 if ( reader . TokenType == JsonTokenType . StartObject )
137148 {
149+ type = "object" ;
138150 var obj = new OpenApiObject ( ) ;
139151 reader . Read ( ) ;
140152 while ( reader . TokenType != JsonTokenType . EndObject )
@@ -294,6 +306,13 @@ public static void ReadProperty(ref Utf8JsonReader reader, string propertyName,
294306 reader . Read ( ) ;
295307 schema . Extensions . Add ( OpenApiConstants . SchemaId , new OpenApiString ( reader . GetString ( ) ) ) ;
296308 break ;
309+ // OpenAPI does not support the `const` keyword in its schema implementation, so
310+ // we map it to its closest approximation, an enum with a single value, here.
311+ case OpenApiSchemaKeywords . ConstKeyword :
312+ reader . Read ( ) ;
313+ schema . Enum = [ ReadOpenApiAny ( ref reader , out var constType ) ] ;
314+ schema . Type = constType ;
315+ break ;
297316 default :
298317 reader . Skip ( ) ;
299318 break ;
0 commit comments