Skip to content

Commit 82b4c60

Browse files
committed
Use string comparison; refactor code
1 parent f2b651e commit 82b4c60

File tree

1 file changed

+56
-41
lines changed

1 file changed

+56
-41
lines changed

src/Microsoft.OpenApi/Models/OpenApiComponents.cs

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,18 @@ public OpenApiComponents(OpenApiComponents components)
102102
/// <param name="writer"></param>
103103
public void SerializeAsV31(IOpenApiWriter writer)
104104
{
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+
}
107114

115+
writer.WriteStartObject();
116+
108117
// pathItems - only present in v3.1
109118
writer.WriteOptionalMap(
110119
OpenApiConstants.PathItems,
@@ -122,8 +131,9 @@ public void SerializeAsV31(IOpenApiWriter writer)
122131
component.SerializeAsV31(w);
123132
}
124133
});
125-
126-
writer.WriteEndObject();
134+
135+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer),
136+
(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer));
127137
}
128138

129139
/// <summary>
@@ -132,9 +142,19 @@ public void SerializeAsV31(IOpenApiWriter writer)
132142
/// <param name="writer"></param>
133143
public void SerializeAsV3(IOpenApiWriter writer)
134144
{
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();
135156
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer),
136157
(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer));
137-
writer.WriteEndObject();
138158
}
139159

140160
/// <summary>
@@ -143,32 +163,6 @@ public void SerializeAsV3(IOpenApiWriter writer)
143163
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
144164
Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, IOpenApiReferenceable> action)
145165
{
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-
172166
// Serialize each referenceable object as full object without reference if the reference in the object points to itself.
173167
// If the reference exists but points to other objects, the object is serialized to just that reference.
174168

@@ -180,7 +174,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
180174
{
181175
if (component.Reference != null &&
182176
component.Reference.Type == ReferenceType.Schema &&
183-
component.Reference.Id == key)
177+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
184178
{
185179
action(w, component);
186180
}
@@ -198,7 +192,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
198192
{
199193
if (component.Reference != null &&
200194
component.Reference.Type == ReferenceType.Response &&
201-
component.Reference.Id == key)
195+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
202196
{
203197
action(w, component);
204198
}
@@ -216,7 +210,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
216210
{
217211
if (component.Reference != null &&
218212
component.Reference.Type == ReferenceType.Parameter &&
219-
component.Reference.Id == key)
213+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
220214
{
221215
action(w, component);
222216
}
@@ -234,7 +228,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
234228
{
235229
if (component.Reference != null &&
236230
component.Reference.Type == ReferenceType.Example &&
237-
component.Reference.Id == key)
231+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
238232
{
239233
action(writer, component);
240234
}
@@ -251,8 +245,9 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
251245
(w, key, component) =>
252246
{
253247
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+
256251
{
257252
action(w, component);
258253
}
@@ -270,7 +265,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
270265
{
271266
if (component.Reference != null &&
272267
component.Reference.Type == ReferenceType.Header &&
273-
component.Reference.Id == key)
268+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
274269
{
275270
action(w, component);
276271
}
@@ -288,7 +283,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
288283
{
289284
if (component.Reference != null &&
290285
component.Reference.Type == ReferenceType.SecurityScheme &&
291-
component.Reference.Id == key)
286+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
292287
{
293288
action(w, component);
294289
}
@@ -306,7 +301,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
306301
{
307302
if (component.Reference != null &&
308303
component.Reference.Type == ReferenceType.Link &&
309-
component.Reference.Id == key)
304+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
310305
{
311306
action(w, component);
312307
}
@@ -324,7 +319,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
324319
{
325320
if (component.Reference != null &&
326321
component.Reference.Type == ReferenceType.Callback &&
327-
component.Reference.Id == key)
322+
string.Equals(component.Reference.Id, key, StringComparison.OrdinalIgnoreCase))
328323
{
329324
action(w, component);
330325
}
@@ -336,8 +331,28 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
336331

337332
// extensions
338333
writer.WriteExtensions(Extensions, version);
334+
writer.WriteEndObject();
339335
}
340336

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+
341356
/// <summary>
342357
/// Serialize <see cref="OpenApiComponents"/> to Open Api v2.0.
343358
/// </summary>

0 commit comments

Comments
 (0)