|
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;
|
@@ -110,7 +111,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
|
110 | 111 | // however if they have cycles, then we will need a component rendered
|
111 | 112 | if (writer.GetSettings().InlineLocalReferences)
|
112 | 113 | {
|
113 |
| - RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer)); |
| 114 | + RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1); |
114 | 115 | return;
|
115 | 116 | }
|
116 | 117 |
|
@@ -148,7 +149,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
|
148 | 149 | // however if they have cycles, then we will need a component rendered
|
149 | 150 | if (writer.GetSettings().InlineLocalReferences)
|
150 | 151 | {
|
151 |
| - RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer)); |
| 152 | + RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer), OpenApiSpecVersion.OpenApi3_0); |
152 | 153 | return;
|
153 | 154 | }
|
154 | 155 |
|
@@ -315,14 +316,27 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
|
315 | 316 | writer.WriteEndObject();
|
316 | 317 | }
|
317 | 318 |
|
318 |
| - private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback) |
| 319 | + private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback, OpenApiSpecVersion version) |
319 | 320 | {
|
320 | 321 | var loops = writer.GetSettings().LoopDetector.Loops;
|
321 | 322 | writer.WriteStartObject();
|
322 | 323 | if (loops.TryGetValue(typeof(OpenApiSchema), out var schemas))
|
323 | 324 | {
|
324 | 325 | writer.WriteOptionalMap(OpenApiConstants.Schemas, Schemas, callback);
|
325 | 326 | }
|
| 327 | + // always render security schemes as inlining of security requirement objects is not allowed in the spec |
| 328 | + if (SecuritySchemes is not null && SecuritySchemes.Any()) |
| 329 | + { |
| 330 | + writer.WriteOptionalMap( |
| 331 | + OpenApiConstants.SecuritySchemes, |
| 332 | + SecuritySchemes, |
| 333 | + (w, key, component) => |
| 334 | + { |
| 335 | + if (version is OpenApiSpecVersion.OpenApi3_1) |
| 336 | + component.SerializeAsV31(writer); |
| 337 | + component.SerializeAsV3(writer); |
| 338 | + }); |
| 339 | + } |
326 | 340 | writer.WriteEndObject();
|
327 | 341 | }
|
328 | 342 |
|
|
0 commit comments