Skip to content

Commit 8963468

Browse files
committed
Use action function instead of delegate; Add method for serializing v3.1 without reference and clean up tests
1 parent 2baa14c commit 8963468

34 files changed

+339
-138
lines changed

src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ namespace Microsoft.OpenApi.Extensions
1515
/// </summary>
1616
public static class OpenApiSerializableExtensions
1717
{
18-
public delegate void SerializeDelegate(IOpenApiWriter writer, IOpenApiSerializable element);
19-
2018
/// <summary>
2119
/// Serialize the <see cref="IOpenApiSerializable"/> to the Open API document (JSON) using the given stream and specification version.
2220
/// </summary>

src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,16 @@ public interface IOpenApiReferenceable : IOpenApiSerializable
2222
/// Reference object.
2323
/// </summary>
2424
OpenApiReference Reference { get; set; }
25-
25+
26+
/// <summary>
27+
/// Serialize to OpenAPI V31 document without using reference.
28+
/// </summary>
29+
void SerializeAsV31WithoutReference(IOpenApiWriter writer);
30+
2631
/// <summary>
2732
/// Serialize to OpenAPI V3 document without using reference.
2833
/// </summary>
29-
void SerializeAsV3WithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback);
34+
void SerializeAsV3WithoutReference(IOpenApiWriter writer);
3035

3136
/// <summary>
3237
/// Serialize to OpenAPI V2 document without using reference.

src/Microsoft.OpenApi/Models/OpenApiCallback.cs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Expressions;
67
using Microsoft.OpenApi.Interfaces;
@@ -83,24 +84,28 @@ public void AddPathItem(RuntimeExpression expression, OpenApiPathItem pathItem)
8384
/// <exception cref="System.NotImplementedException"></exception>
8485
public void SerializeAsV31(IOpenApiWriter writer)
8586
{
86-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV3(writer));
87+
SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer),
88+
(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer));
8789
}
8890

8991
/// <summary>
9092
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.0
9193
/// </summary>
9294
public void SerializeAsV3(IOpenApiWriter writer)
9395
{
94-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
96+
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer),
97+
(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer));
9598
}
9699

97100
/// <summary>
98101
/// Serialize <see cref="OpenApiCallback"/>
99102
/// </summary>
100103
/// <param name="writer"></param>
101-
/// <param name="version"></param>
102104
/// <param name="callback"></param>
103-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
105+
/// <param name="action"></param>
106+
private void SerializeInternal(IOpenApiWriter writer,
107+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
108+
Action<IOpenApiWriter, IOpenApiReferenceable> action)
104109
{
105110
writer = writer ?? throw Error.ArgumentNull(nameof(writer));
106111

@@ -118,7 +123,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
118123
target = GetEffective(Reference.HostDocument);
119124
}
120125
}
121-
target.SerializeAsV3WithoutReference(writer, version, callback);
126+
action(writer, target);
122127
}
123128

124129
/// <summary>
@@ -138,12 +143,26 @@ public OpenApiCallback GetEffective(OpenApiDocument doc)
138143
}
139144
}
140145

146+
/// <summary>
147+
/// Serialize to OpenAPI V31 document without using reference.
148+
/// </summary>
149+
public void SerializeAsV31WithoutReference(IOpenApiWriter writer)
150+
{
151+
SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1,
152+
(writer, element) => element.SerializeAsV31(writer));
153+
}
141154

142155
/// <summary>
143156
/// Serialize to OpenAPI V3 document without using reference.
144157
/// </summary>
158+
public void SerializeAsV3WithoutReference(IOpenApiWriter writer)
159+
{
160+
SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0,
161+
(writer, element) => element.SerializeAsV3(writer));
162+
}
145163

146-
public void SerializeAsV3WithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
164+
private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version,
165+
Action<IOpenApiWriter, IOpenApiSerializable> callback)
147166
{
148167
writer.WriteStartObject();
149168

@@ -155,7 +174,7 @@ public void SerializeAsV3WithoutReference(IOpenApiWriter writer, OpenApiSpecVers
155174

156175
// extensions
157176
writer.WriteExtensions(Extensions, version);
158-
177+
159178
writer.WriteEndObject();
160179
}
161180

src/Microsoft.OpenApi/Models/OpenApiComponents.cs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ public OpenApiComponents(OpenApiComponents components)
101101
/// </summary>
102102
/// <param name="writer"></param>
103103
public void SerializeAsV31(IOpenApiWriter writer)
104-
{
105-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV3(writer));
106-
104+
{
105+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer),
106+
(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer));
107+
107108
// pathItems - only present in v3.1
108109
writer.WriteOptionalMap(
109110
OpenApiConstants.PathItems,
@@ -114,11 +115,11 @@ public void SerializeAsV31(IOpenApiWriter writer)
114115
component.Reference.Type == ReferenceType.Schema &&
115116
component.Reference.Id == key)
116117
{
117-
component.SerializeAsV3WithoutReference(w, OpenApiSpecVersion.OpenApi3_1, callback: (w, e) => e.SerializeAsV3(w));
118+
component.SerializeAsV31WithoutReference(w);
118119
}
119120
else
120121
{
121-
component.SerializeAsV3(w);
122+
component.SerializeAsV31(w);
122123
}
123124
});
124125

@@ -131,14 +132,16 @@ public void SerializeAsV31(IOpenApiWriter writer)
131132
/// <param name="writer"></param>
132133
public void SerializeAsV3(IOpenApiWriter writer)
133134
{
134-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
135+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer),
136+
(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer));
135137
writer.WriteEndObject();
136138
}
137139

138140
/// <summary>
139141
/// Serialize <see cref="OpenApiComponents"/>.
140142
/// </summary>
141-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
143+
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
144+
Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, IOpenApiReferenceable> action)
142145
{
143146
writer = writer ?? throw Error.ArgumentNull(nameof(writer));
144147

@@ -157,7 +160,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
157160
OpenApiConstants.Schemas,
158161
Schemas,
159162
(w, key, component) => {
160-
component.SerializeAsV3WithoutReference(w, version, callback);
163+
action(w, component);
161164
});
162165
}
163166
writer.WriteEndObject();
@@ -179,7 +182,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
179182
component.Reference.Type == ReferenceType.Schema &&
180183
component.Reference.Id == key)
181184
{
182-
component.SerializeAsV3WithoutReference(w, version, callback);
185+
action(w, component);
183186
}
184187
else
185188
{
@@ -197,7 +200,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
197200
component.Reference.Type == ReferenceType.Response &&
198201
component.Reference.Id == key)
199202
{
200-
component.SerializeAsV3WithoutReference(w, version, callback);
203+
action(w, component);
201204
}
202205
else
203206
{
@@ -215,7 +218,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
215218
component.Reference.Type == ReferenceType.Parameter &&
216219
component.Reference.Id == key)
217220
{
218-
component.SerializeAsV3WithoutReference(w, version, callback);
221+
action(w, component);
219222
}
220223
else
221224
{
@@ -233,7 +236,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
233236
component.Reference.Type == ReferenceType.Example &&
234237
component.Reference.Id == key)
235238
{
236-
component.SerializeAsV3WithoutReference(w, version, callback);
239+
action(writer, component);
237240
}
238241
else
239242
{
@@ -251,7 +254,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
251254
component.Reference.Type == ReferenceType.RequestBody &&
252255
component.Reference.Id == key)
253256
{
254-
component.SerializeAsV3WithoutReference(w, version, callback);
257+
action(w, component);
255258
}
256259
else
257260
{
@@ -269,7 +272,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
269272
component.Reference.Type == ReferenceType.Header &&
270273
component.Reference.Id == key)
271274
{
272-
component.SerializeAsV3WithoutReference(w, version, callback);
275+
action(w, component);
273276
}
274277
else
275278
{
@@ -287,7 +290,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
287290
component.Reference.Type == ReferenceType.SecurityScheme &&
288291
component.Reference.Id == key)
289292
{
290-
component.SerializeAsV3WithoutReference(w, version, callback);
293+
action(w, component);
291294
}
292295
else
293296
{
@@ -305,7 +308,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
305308
component.Reference.Type == ReferenceType.Link &&
306309
component.Reference.Id == key)
307310
{
308-
component.SerializeAsV3WithoutReference(w, version, callback);
311+
action(w, component);
309312
}
310313
else
311314
{
@@ -323,7 +326,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
323326
component.Reference.Type == ReferenceType.Callback &&
324327
component.Reference.Id == key)
325328
{
326-
component.SerializeAsV3WithoutReference(w, version, callback);
329+
action(w, component);
327330
}
328331
else
329332
{

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ public void SerializeAsV31(IOpenApiWriter writer)
122122
// jsonSchemaDialect
123123
writer.WriteProperty(OpenApiConstants.JsonSchemaDialect, JsonSchemaDialect);
124124

125-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w));
125+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w),
126+
(w, element) => element.SerializeAsV31WithoutReference(w));
126127

127128
// webhooks
128129
writer.WriteOptionalMap(
@@ -134,7 +135,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
134135
component.Reference.Type == ReferenceType.PathItem &&
135136
component.Reference.Id == key)
136137
{
137-
component.SerializeAsV3WithoutReference(w, OpenApiSpecVersion.OpenApi3_1, callback: (w, e) => e.SerializeAsV3(w));
138+
component.SerializeAsV31WithoutReference(w);
138139
}
139140
else
140141
{
@@ -157,7 +158,8 @@ public void SerializeAsV3(IOpenApiWriter writer)
157158

158159
// openapi
159160
writer.WriteProperty(OpenApiConstants.OpenApi, "3.0.1");
160-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (w, element) => element.SerializeAsV3(w));
161+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (w, element) => element.SerializeAsV3(w),
162+
(w, element) => element.SerializeAsV3WithoutReference(w));
161163
writer.WriteEndObject();
162164
}
163165

@@ -167,7 +169,10 @@ public void SerializeAsV3(IOpenApiWriter writer)
167169
/// <param name="writer"></param>
168170
/// <param name="version"></param>
169171
/// <param name="callback"></param>
170-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
172+
/// <param name="action"></param>
173+
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
174+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
175+
Action<IOpenApiWriter, IOpenApiReferenceable> action)
171176
{
172177
// info
173178
writer.WriteRequiredObject(OpenApiConstants.Info, Info, (w, i) => callback(w, i));
@@ -188,13 +193,13 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
188193
(w, s) => callback(w, s));
189194

190195
// tags
191-
writer.WriteOptionalCollection(OpenApiConstants.Tags, Tags, (w, t) => t.SerializeAsV3WithoutReference(w, version, callback));
196+
writer.WriteOptionalCollection(OpenApiConstants.Tags, Tags, (w, t) => action(w, t));
192197

193198
// external docs
194199
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, (w, e) => callback(w, e));
195200

196201
// extensions
197-
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
202+
writer.WriteExtensions(Extensions, version);
198203
}
199204

200205
/// <summary>

src/Microsoft.OpenApi/Models/OpenApiEncoding.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Any;
67
using Microsoft.OpenApi.Extensions;
@@ -93,7 +94,8 @@ public void SerializeAsV3(IOpenApiWriter writer)
9394
/// <summary>
9495
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.0.
9596
/// </summary>
96-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
97+
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
98+
Action<IOpenApiWriter, IOpenApiSerializable> callback)
9799
{
98100
writer = writer ?? throw Error.ArgumentNull(nameof(writer));
99101

src/Microsoft.OpenApi/Models/OpenApiExample.cs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Any;
67
using Microsoft.OpenApi.Interfaces;
@@ -80,7 +81,8 @@ public OpenApiExample(OpenApiExample example)
8081
/// <param name="writer"></param>
8182
public void SerializeAsV31(IOpenApiWriter writer)
8283
{
83-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
84+
SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer),
85+
(writer, element) => element.SerializeAsV31WithoutReference(writer));
8486
}
8587

8688
/// <summary>
@@ -89,13 +91,12 @@ public void SerializeAsV31(IOpenApiWriter writer)
8991
/// <param name="writer"></param>
9092
public void SerializeAsV3(IOpenApiWriter writer)
9193
{
92-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
94+
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer),
95+
(writer, element) => element.SerializeAsV3WithoutReference(writer));
9396
}
9497

95-
/// <summary>
96-
/// Serialize <see cref="OpenApiExample"/> to Open Api v3.0
97-
/// </summary>
98-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
98+
private void SerializeInternal(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback,
99+
Action<IOpenApiWriter, IOpenApiReferenceable> action)
99100
{
100101
writer = writer ?? throw Error.ArgumentNull(nameof(writer));
101102

@@ -113,7 +114,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
113114
target = GetEffective(Reference.HostDocument);
114115
}
115116
}
116-
target.SerializeAsV3WithoutReference(writer, version, callback);
117+
action(writer, target);
117118
}
118119

119120
/// <summary>
@@ -134,9 +135,22 @@ public OpenApiExample GetEffective(OpenApiDocument doc)
134135
}
135136

136137
/// <summary>
137-
/// Serialize to OpenAPI V3 document without using reference.
138+
/// Serialize to OpenAPI V31 example without using reference.
139+
/// </summary>
140+
public void SerializeAsV31WithoutReference(IOpenApiWriter writer)
141+
{
142+
SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1);
143+
}
144+
145+
/// <summary>
146+
/// Serialize to OpenAPI V3 example without using reference.
138147
/// </summary>
139-
public void SerializeAsV3WithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, SerializeDelegate callback)
148+
public void SerializeAsV3WithoutReference(IOpenApiWriter writer)
149+
{
150+
SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0);
151+
}
152+
153+
private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version)
140154
{
141155
writer.WriteStartObject();
142156

0 commit comments

Comments
 (0)