|
3 | 3 |
|
4 | 4 | using System; |
5 | 5 | using System.Collections.Generic; |
| 6 | +using System.Linq; |
6 | 7 | using Microsoft.OpenApi.Interfaces; |
7 | 8 | using Microsoft.OpenApi.Models.Interfaces; |
8 | 9 | using Microsoft.OpenApi.Models.References; |
9 | 10 | using Microsoft.OpenApi.Writers; |
10 | 11 |
|
11 | | -#nullable enable |
12 | | - |
13 | 12 | namespace Microsoft.OpenApi.Models |
14 | 13 | { |
15 | 14 | /// <summary> |
@@ -110,7 +109,7 @@ public void SerializeAsV31(IOpenApiWriter writer) |
110 | 109 | // however if they have cycles, then we will need a component rendered |
111 | 110 | if (writer.GetSettings().InlineLocalReferences) |
112 | 111 | { |
113 | | - RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer)); |
| 112 | + RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1); |
114 | 113 | return; |
115 | 114 | } |
116 | 115 |
|
@@ -148,7 +147,7 @@ public void SerializeAsV3(IOpenApiWriter writer) |
148 | 147 | // however if they have cycles, then we will need a component rendered |
149 | 148 | if (writer.GetSettings().InlineLocalReferences) |
150 | 149 | { |
151 | | - RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer)); |
| 150 | + RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer), OpenApiSpecVersion.OpenApi3_0); |
152 | 151 | return; |
153 | 152 | } |
154 | 153 |
|
@@ -315,14 +314,27 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version |
315 | 314 | writer.WriteEndObject(); |
316 | 315 | } |
317 | 316 |
|
318 | | - private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback) |
| 317 | + private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback, OpenApiSpecVersion version) |
319 | 318 | { |
320 | 319 | var loops = writer.GetSettings().LoopDetector.Loops; |
321 | 320 | writer.WriteStartObject(); |
322 | 321 | if (loops.TryGetValue(typeof(OpenApiSchema), out var schemas)) |
323 | 322 | { |
324 | 323 | writer.WriteOptionalMap(OpenApiConstants.Schemas, Schemas, callback); |
325 | 324 | } |
| 325 | + // always render security schemes as inlining of security requirement objects is not allowed in the spec |
| 326 | + if (SecuritySchemes is not null && SecuritySchemes.Any()) |
| 327 | + { |
| 328 | + writer.WriteOptionalMap( |
| 329 | + OpenApiConstants.SecuritySchemes, |
| 330 | + SecuritySchemes, |
| 331 | + (w, key, component) => |
| 332 | + { |
| 333 | + if (version is OpenApiSpecVersion.OpenApi3_1) |
| 334 | + component.SerializeAsV31(writer); |
| 335 | + component.SerializeAsV3(writer); |
| 336 | + }); |
| 337 | + } |
326 | 338 | writer.WriteEndObject(); |
327 | 339 | } |
328 | 340 |
|
|
0 commit comments