@@ -102,9 +102,18 @@ public OpenApiComponents(OpenApiComponents components)
102
102
/// <param name="writer"></param>
103
103
public void SerializeAsV31 ( IOpenApiWriter writer )
104
104
{
105
- SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_1 , ( writer , element ) => element . SerializeAsV31 ( writer ) ,
106
- ( writer , referenceElement ) => referenceElement . SerializeAsV31WithoutReference ( writer ) ) ;
105
+ writer = writer ?? throw Error . ArgumentNull ( nameof ( writer ) ) ;
106
+
107
+ // If references have been inlined we don't need the to render the components section
108
+ // however if they have cycles, then we will need a component rendered
109
+ if ( writer . GetSettings ( ) . InlineLocalReferences )
110
+ {
111
+ RenderComponents ( writer ) ;
112
+ return ;
113
+ }
107
114
115
+ writer . WriteStartObject ( ) ;
116
+
108
117
// pathItems - only present in v3.1
109
118
writer . WriteOptionalMap (
110
119
OpenApiConstants . PathItems ,
@@ -122,8 +131,9 @@ public void SerializeAsV31(IOpenApiWriter writer)
122
131
component . SerializeAsV31 ( w ) ;
123
132
}
124
133
} ) ;
125
-
126
- writer . WriteEndObject ( ) ;
134
+
135
+ SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_1 , ( writer , element ) => element . SerializeAsV31 ( writer ) ,
136
+ ( writer , referenceElement ) => referenceElement . SerializeAsV31WithoutReference ( writer ) ) ;
127
137
}
128
138
129
139
/// <summary>
@@ -132,9 +142,19 @@ public void SerializeAsV31(IOpenApiWriter writer)
132
142
/// <param name="writer"></param>
133
143
public void SerializeAsV3 ( IOpenApiWriter writer )
134
144
{
145
+ writer = writer ?? throw Error . ArgumentNull ( nameof ( writer ) ) ;
146
+
147
+ // If references have been inlined we don't need the to render the components section
148
+ // however if they have cycles, then we will need a component rendered
149
+ if ( writer . GetSettings ( ) . InlineLocalReferences )
150
+ {
151
+ RenderComponents ( writer ) ;
152
+ return ;
153
+ }
154
+
155
+ writer . WriteStartObject ( ) ;
135
156
SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_0 , ( writer , element ) => element . SerializeAsV3 ( writer ) ,
136
157
( writer , referenceElement ) => referenceElement . SerializeAsV3WithoutReference ( writer ) ) ;
137
- writer . WriteEndObject ( ) ;
138
158
}
139
159
140
160
/// <summary>
@@ -143,32 +163,6 @@ public void SerializeAsV3(IOpenApiWriter writer)
143
163
private void SerializeInternal ( IOpenApiWriter writer , OpenApiSpecVersion version ,
144
164
Action < IOpenApiWriter , IOpenApiSerializable > callback , Action < IOpenApiWriter , IOpenApiReferenceable > action )
145
165
{
146
- writer = writer ?? throw Error . ArgumentNull ( nameof ( writer ) ) ;
147
-
148
- // If references have been inlined we don't need the to render the components section
149
- // however if they have cycles, then we will need a component rendered
150
- if ( writer . GetSettings ( ) . InlineLocalReferences )
151
- {
152
- var loops = writer . GetSettings ( ) . LoopDetector . Loops ;
153
- writer . WriteStartObject ( ) ;
154
- if ( loops . TryGetValue ( typeof ( OpenApiSchema ) , out List < object > schemas ) )
155
- {
156
- var openApiSchemas = schemas . Cast < OpenApiSchema > ( ) . Distinct ( ) . ToList ( )
157
- . ToDictionary < OpenApiSchema , string > ( k => k . Reference . Id ) ;
158
-
159
- writer . WriteOptionalMap (
160
- OpenApiConstants . Schemas ,
161
- Schemas ,
162
- ( w , key , component ) => {
163
- action ( w , component ) ;
164
- } ) ;
165
- }
166
- writer . WriteEndObject ( ) ;
167
- return ;
168
- }
169
-
170
- writer . WriteStartObject ( ) ;
171
-
172
166
// Serialize each referenceable object as full object without reference if the reference in the object points to itself.
173
167
// If the reference exists but points to other objects, the object is serialized to just that reference.
174
168
@@ -180,7 +174,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
180
174
{
181
175
if ( component . Reference != null &&
182
176
component . Reference . Type == ReferenceType . Schema &&
183
- component . Reference . Id == key )
177
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
184
178
{
185
179
action ( w , component ) ;
186
180
}
@@ -198,7 +192,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
198
192
{
199
193
if ( component . Reference != null &&
200
194
component . Reference . Type == ReferenceType . Response &&
201
- component . Reference . Id == key )
195
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
202
196
{
203
197
action ( w , component ) ;
204
198
}
@@ -216,7 +210,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
216
210
{
217
211
if ( component . Reference != null &&
218
212
component . Reference . Type == ReferenceType . Parameter &&
219
- component . Reference . Id == key )
213
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
220
214
{
221
215
action ( w , component ) ;
222
216
}
@@ -234,7 +228,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
234
228
{
235
229
if ( component . Reference != null &&
236
230
component . Reference . Type == ReferenceType . Example &&
237
- component . Reference . Id == key )
231
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
238
232
{
239
233
action ( writer , component ) ;
240
234
}
@@ -251,8 +245,9 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
251
245
( w , key , component ) =>
252
246
{
253
247
if ( component . Reference != null &&
254
- component . Reference . Type == ReferenceType . RequestBody &&
255
- component . Reference . Id == key )
248
+ component . Reference . Type == ReferenceType . RequestBody &&
249
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
250
+
256
251
{
257
252
action ( w , component ) ;
258
253
}
@@ -270,7 +265,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
270
265
{
271
266
if ( component . Reference != null &&
272
267
component . Reference . Type == ReferenceType . Header &&
273
- component . Reference . Id == key )
268
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
274
269
{
275
270
action ( w , component ) ;
276
271
}
@@ -288,7 +283,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
288
283
{
289
284
if ( component . Reference != null &&
290
285
component . Reference . Type == ReferenceType . SecurityScheme &&
291
- component . Reference . Id == key )
286
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
292
287
{
293
288
action ( w , component ) ;
294
289
}
@@ -306,7 +301,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
306
301
{
307
302
if ( component . Reference != null &&
308
303
component . Reference . Type == ReferenceType . Link &&
309
- component . Reference . Id == key )
304
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
310
305
{
311
306
action ( w , component ) ;
312
307
}
@@ -324,7 +319,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
324
319
{
325
320
if ( component . Reference != null &&
326
321
component . Reference . Type == ReferenceType . Callback &&
327
- component . Reference . Id == key )
322
+ string . Equals ( component . Reference . Id , key , StringComparison . OrdinalIgnoreCase ) )
328
323
{
329
324
action ( w , component ) ;
330
325
}
@@ -336,8 +331,28 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
336
331
337
332
// extensions
338
333
writer . WriteExtensions ( Extensions , version ) ;
334
+ writer . WriteEndObject ( ) ;
339
335
}
340
336
337
+ private void RenderComponents ( IOpenApiWriter writer )
338
+ {
339
+ var loops = writer . GetSettings ( ) . LoopDetector . Loops ;
340
+ writer . WriteStartObject ( ) ;
341
+ if ( loops . TryGetValue ( typeof ( OpenApiSchema ) , out List < object > schemas ) )
342
+ {
343
+ var openApiSchemas = schemas . Cast < OpenApiSchema > ( ) . Distinct ( ) . ToList ( )
344
+ . ToDictionary < OpenApiSchema , string > ( k => k . Reference . Id ) ;
345
+
346
+ writer . WriteOptionalMap (
347
+ OpenApiConstants . Schemas ,
348
+ Schemas ,
349
+ ( w , key , component ) => {
350
+ component . SerializeAsV31WithoutReference ( w ) ;
351
+ } ) ;
352
+ }
353
+ writer . WriteEndObject ( ) ;
354
+ }
355
+
341
356
/// <summary>
342
357
/// Serialize <see cref="OpenApiComponents"/> to Open Api v2.0.
343
358
/// </summary>
0 commit comments