Skip to content

Commit c3aa16d

Browse files
authored
Merge pull request #19 from BinkyLabs/feat/enum-version
adds new OAS vesion and serialization/deserialization infrastructure
2 parents 2e7866c + 7406953 commit c3aa16d

File tree

98 files changed

+3550
-56
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+3550
-56
lines changed

src/Microsoft.OpenApi.Hidi/OpenApiService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ public static async Task TransformOpenApiDocumentAsync(HidiOptions options, ILog
6767
throw new IOException($"The file {options.Output} already exists. Please input a new file path.");
6868
}
6969

70-
// Default to yaml and OpenApiVersion 3_1 during csdl to OpenApi conversion
70+
// Default to yaml and OpenApiVersion 3_2 during csdl to OpenApi conversion
7171
var openApiFormat = options.OpenApiFormat ?? (!string.IsNullOrEmpty(options.OpenApi) ? GetOpenApiFormat(options.OpenApi, logger) : OpenApiConstants.Yaml);
72-
var openApiVersion = options.Version != null ? TryParseOpenApiSpecVersion(options.Version) : OpenApiSpecVersion.OpenApi3_1;
72+
var openApiVersion = options.Version != null ? TryParseOpenApiSpecVersion(options.Version) : OpenApiSpecVersion.OpenApi3_2;
7373

7474
// If ApiManifest is provided, set the referenced OpenAPI document
7575
var apiDependency = await FindApiDependencyAsync(options.FilterOptions.FilterByApiManifest, logger, cancellationToken).ConfigureAwait(false);

src/Microsoft.OpenApi.Hidi/OpenApiSpecVersionHelper.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ public static OpenApiSpecVersion TryParseOpenApiSpecVersion(string value)
3535
{
3636
return OpenApiSpecVersion.OpenApi3_1;
3737
}
38+
else if (majorVersion == 3 && minorVersion == 2)
39+
{
40+
return OpenApiSpecVersion.OpenApi3_2;
41+
}
3842

39-
return OpenApiSpecVersion.OpenApi3_1; // default
43+
return OpenApiSpecVersion.OpenApi3_2; // default
4044
}
4145
}
4246
}

src/Microsoft.OpenApi.Workbench/MainModel.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ public OpenApiSpecVersion Version
155155
OnPropertyChanged(nameof(IsV2_0));
156156
OnPropertyChanged(nameof(IsV3_0));
157157
OnPropertyChanged(nameof(IsV3_1));
158+
OnPropertyChanged(nameof(IsV3_2));
158159
}
159160
}
160161

@@ -188,6 +189,12 @@ public bool IsV3_1
188189
set => Version = value ? OpenApiSpecVersion.OpenApi3_1 : Version;
189190
}
190191

192+
public bool IsV3_2
193+
{
194+
get => Version == OpenApiSpecVersion.OpenApi3_2;
195+
set => Version = value ? OpenApiSpecVersion.OpenApi3_2 : Version;
196+
}
197+
191198
/// <summary>
192199
/// Handling method when the property with given name has changed.
193200
/// </summary>

src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public static Task SerializeAsync<T>(this T element, IOpenApiWriter writer, Open
111111

112112
switch (specVersion)
113113
{
114+
case OpenApiSpecVersion.OpenApi3_2:
115+
element.SerializeAsV32(writer);
116+
break;
117+
114118
case OpenApiSpecVersion.OpenApi3_1:
115119
element.SerializeAsV31(writer);
116120
break;

src/Microsoft.OpenApi/Interfaces/IOpenApiSerializable.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ namespace Microsoft.OpenApi
88
/// </summary>
99
public interface IOpenApiSerializable : IOpenApiElement
1010
{
11+
/// <summary>
12+
/// Serialize OpenAPI element into v3.2
13+
/// </summary>
14+
/// <param name="writer"></param>
15+
void SerializeAsV32(IOpenApiWriter writer);
1116
/// <summary>
1217
/// Serialize OpenAPI element into v3.1
1318
/// </summary>

src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,27 @@ public BaseOpenApiReference(BaseOpenApiReference reference)
150150
HostDocument = reference.HostDocument;
151151
}
152152

153+
/// <inheritdoc/>
154+
public virtual void SerializeAsV32(IOpenApiWriter writer)
155+
{
156+
SerializeInternal(writer, SerializeAdditionalV32Properties);
157+
}
158+
153159
/// <inheritdoc/>
154160
public virtual void SerializeAsV31(IOpenApiWriter writer)
155161
{
156162
SerializeInternal(writer, SerializeAdditionalV31Properties);
157163
}
158164

165+
/// <summary>
166+
/// Serialize additional properties for Open Api v3.2.
167+
/// </summary>
168+
/// <param name="writer"></param>
169+
protected virtual void SerializeAdditionalV32Properties(IOpenApiWriter writer)
170+
{
171+
// noop for the base type
172+
}
173+
159174
/// <summary>
160175
/// Serialize additional properties for Open Api v3.1.
161176
/// </summary>

src/Microsoft.OpenApi/Models/JsonSchemaReference.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,20 @@ public JsonSchemaReference(JsonSchemaReference reference) : base(reference)
7171

7272
/// <inheritdoc/>
7373
protected override void SerializeAdditionalV31Properties(IOpenApiWriter writer)
74+
{
75+
SerializeAdditionalV3XProperties(writer, base.SerializeAdditionalV31Properties);
76+
}
77+
/// <inheritdoc/>
78+
protected override void SerializeAdditionalV32Properties(IOpenApiWriter writer)
79+
{
80+
SerializeAdditionalV3XProperties(writer, base.SerializeAdditionalV32Properties);
81+
}
82+
private void SerializeAdditionalV3XProperties(IOpenApiWriter writer, Action<IOpenApiWriter> baseSerializer)
7483
{
7584
if (Type != ReferenceType.Schema) throw new InvalidOperationException(
7685
$"JsonSchemaReference can only be serialized for ReferenceType.Schema, but was {Type}.");
7786

78-
base.SerializeAdditionalV31Properties(writer);
87+
baseSerializer(writer);
7988
// Additional schema metadata annotations in 3.1
8089
writer.WriteOptionalObject(OpenApiConstants.Default, Default, (w, d) => w.WriteAny(d));
8190
writer.WriteProperty(OpenApiConstants.Title, Title);

src/Microsoft.OpenApi/Models/OpenApiCallback.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ public void AddPathItem(RuntimeExpression expression, IOpenApiPathItem pathItem)
5050
PathItems.Add(expression, pathItem);
5151
}
5252

53+
/// <summary>
54+
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.2
55+
/// </summary>
56+
/// <param name="writer"></param>
57+
/// <exception cref="System.NotImplementedException"></exception>
58+
public virtual void SerializeAsV32(IOpenApiWriter writer)
59+
{
60+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer));
61+
}
62+
5363
/// <summary>
5464
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.1
5565
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiComponents.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,32 @@ public OpenApiComponents(OpenApiComponents? components)
9090
Extensions = components?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(components.Extensions) : null;
9191
}
9292

93+
/// <summary>
94+
/// Serialize <see cref="OpenApiComponents"/> to Open API v3.2.
95+
/// </summary>
96+
/// <param name="writer"></param>
97+
public virtual void SerializeAsV32(IOpenApiWriter writer)
98+
{
99+
SerializeAsV3X(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer), (writer, referenceElement) => referenceElement.SerializeAsV32(writer));
100+
}
101+
93102
/// <summary>
94103
/// Serialize <see cref="OpenApiComponents"/> to Open API v3.1.
95104
/// </summary>
96105
/// <param name="writer"></param>
97106
public virtual void SerializeAsV31(IOpenApiWriter writer)
107+
{
108+
SerializeAsV3X(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer), (writer, referenceElement) => referenceElement.SerializeAsV31(writer));
109+
}
110+
private void SerializeAsV3X(IOpenApiWriter writer, OpenApiSpecVersion version, Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, IOpenApiReferenceHolder> action)
98111
{
99112
Utils.CheckArgumentNull(writer);
100113

101114
// If references have been inlined we don't need the to render the components section
102115
// however if they have cycles, then we will need a component rendered
103116
if (writer.GetSettings().InlineLocalReferences)
104117
{
105-
RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1);
118+
RenderComponents(writer, callback, version);
106119
return;
107120
}
108121

@@ -116,16 +129,15 @@ public virtual void SerializeAsV31(IOpenApiWriter writer)
116129
{
117130
if (component is OpenApiPathItemReference reference)
118131
{
119-
reference.SerializeAsV31(w);
132+
action(w, reference);
120133
}
121134
else
122135
{
123-
component.SerializeAsV31(w);
136+
callback(w, component);
124137
}
125138
});
126139

127-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer),
128-
(writer, referenceElement) => referenceElement.SerializeAsV31(writer));
140+
SerializeInternal(writer, version, callback, action);
129141
}
130142

131143
/// <summary>

src/Microsoft.OpenApi/Models/OpenApiContact.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ public OpenApiContact(OpenApiContact contact)
4747
Email = contact?.Email ?? Email;
4848
Extensions = contact?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(contact.Extensions) : null;
4949
}
50+
/// <summary>
51+
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.2
52+
/// </summary>
53+
/// <param name="writer"></param>
54+
public virtual void SerializeAsV32(IOpenApiWriter writer)
55+
{
56+
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_2);
57+
}
5058

5159
/// <summary>
5260
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.1

0 commit comments

Comments
 (0)