Skip to content

Commit 76effe4

Browse files
Merge pull request #1138 from microsoft/mk/add-json-schema-dialect
Add root property jsonSchemaDialect
2 parents 99f2b86 + 06f91f6 commit 76effe4

Some content is hidden

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

46 files changed

+1182
-511
lines changed

src/Microsoft.OpenApi.Readers/ParsingContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ internal OpenApiDocument Parse(YamlDocument yamlDocument)
6969
case string version when version.is3_0() || version.is3_1():
7070
VersionService = new OpenApiV3VersionService(Diagnostic);
7171
doc = VersionService.LoadDocument(RootNode);
72-
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi3_0;
72+
this.Diagnostic.SpecificationVersion = version.is3_1() ? OpenApiSpecVersion.OpenApi3_1 : OpenApiSpecVersion.OpenApi3_0;
7373
ValidateRequiredFields(doc, version);
7474
break;
7575

src/Microsoft.OpenApi.Readers/V3/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal static partial class OpenApiV3Deserializer
2121
} /* Version is valid field but we already parsed it */
2222
},
2323
{"info", (o, n) => o.Info = LoadInfo(n)},
24+
{"jsonSchemaDialect", (o, n) => o.JsonSchemaDialect = n.GetScalarValue() },
2425
{"servers", (o, n) => o.Servers = n.CreateList(LoadServer)},
2526
{"paths", (o, n) => o.Paths = LoadPaths(n)},
2627
{"webhooks", (o, n) => o.Webhooks = LoadPaths(n)},

src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public static void Serialize<T>(this T element, IOpenApiWriter writer, OpenApiSp
117117

118118
switch (specVersion)
119119
{
120+
case OpenApiSpecVersion.OpenApi3_1:
121+
element.SerializeAsV31(writer);
122+
break;
123+
120124
case OpenApiSpecVersion.OpenApi3_0:
121125
element.SerializeAsV3(writer);
122126
break;

src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using Microsoft.OpenApi.Models;
55
using Microsoft.OpenApi.Writers;
6+
using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions;
67

78
namespace Microsoft.OpenApi.Interfaces
89
{
@@ -21,7 +22,12 @@ public interface IOpenApiReferenceable : IOpenApiSerializable
2122
/// Reference object.
2223
/// </summary>
2324
OpenApiReference Reference { get; set; }
24-
25+
26+
/// <summary>
27+
/// Serialize to OpenAPI V31 document without using reference.
28+
/// </summary>
29+
void SerializeAsV31WithoutReference(IOpenApiWriter writer);
30+
2531
/// <summary>
2632
/// Serialize to OpenAPI V3 document without using reference.
2733
/// </summary>

src/Microsoft.OpenApi/Interfaces/IOpenApiSerializable.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ namespace Microsoft.OpenApi.Interfaces
1010
/// </summary>
1111
public interface IOpenApiSerializable : IOpenApiElement
1212
{
13+
/// <summary>
14+
/// Serialize OpenAPI element into v3.1
15+
/// </summary>
16+
/// <param name="writer"></param>
17+
void SerializeAsV31(IOpenApiWriter writer);
18+
1319
/// <summary>
1420
/// Serialize Open API element to v3.0.
1521
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiCallback.cs

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

4+
using System;
45
using System.Collections.Generic;
5-
using Microsoft.OpenApi.Any;
66
using Microsoft.OpenApi.Expressions;
77
using Microsoft.OpenApi.Interfaces;
88
using Microsoft.OpenApi.Writers;
9+
using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions;
910

1011
namespace Microsoft.OpenApi.Models
1112
{
@@ -75,32 +76,54 @@ public void AddPathItem(RuntimeExpression expression, OpenApiPathItem pathItem)
7576

7677
PathItems.Add(expression, pathItem);
7778
}
78-
79+
80+
/// <summary>
81+
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.1
82+
/// </summary>
83+
/// <param name="writer"></param>
84+
/// <exception cref="System.NotImplementedException"></exception>
85+
public void SerializeAsV31(IOpenApiWriter writer)
86+
{
87+
SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer),
88+
(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer));
89+
}
90+
7991
/// <summary>
8092
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.0
8193
/// </summary>
8294
public void SerializeAsV3(IOpenApiWriter writer)
8395
{
84-
if (writer == null)
85-
{
86-
throw Error.ArgumentNull(nameof(writer));
87-
}
96+
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer),
97+
(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer));
98+
}
99+
100+
/// <summary>
101+
/// Serialize <see cref="OpenApiCallback"/>
102+
/// </summary>
103+
/// <param name="writer"></param>
104+
/// <param name="callback"></param>
105+
/// <param name="action"></param>
106+
private void SerializeInternal(IOpenApiWriter writer,
107+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
108+
Action<IOpenApiWriter, IOpenApiReferenceable> action)
109+
{
110+
writer = writer ?? throw Error.ArgumentNull(nameof(writer));
88111

89112
var target = this;
90113

91114
if (Reference != null)
92115
{
93116
if (!writer.GetSettings().ShouldInlineReference(Reference))
94117
{
95-
Reference.SerializeAsV3(writer);
118+
callback(writer, Reference);
96119
return;
97120
}
98121
else
99122
{
100123
target = GetEffective(Reference.HostDocument);
101124
}
102125
}
103-
target.SerializeAsV3WithoutReference(writer);
126+
action(writer, target);
104127
}
105128

106129
/// <summary>
@@ -120,24 +143,38 @@ public OpenApiCallback GetEffective(OpenApiDocument doc)
120143
}
121144
}
122145

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+
}
123154

124155
/// <summary>
125156
/// Serialize to OpenAPI V3 document without using reference.
126157
/// </summary>
127-
128158
public void SerializeAsV3WithoutReference(IOpenApiWriter writer)
159+
{
160+
SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0,
161+
(writer, element) => element.SerializeAsV3(writer));
162+
}
163+
164+
private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version,
165+
Action<IOpenApiWriter, IOpenApiSerializable> callback)
129166
{
130167
writer.WriteStartObject();
131168

132169
// path items
133170
foreach (var item in PathItems)
134171
{
135-
writer.WriteRequiredObject(item.Key.Expression, item.Value, (w, p) => p.SerializeAsV3(w));
172+
writer.WriteRequiredObject(item.Key.Expression, item.Value, callback);
136173
}
137174

138175
// extensions
139-
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
140-
176+
writer.WriteExtensions(Extensions, version);
177+
141178
writer.WriteEndObject();
142179
}
143180

0 commit comments

Comments
 (0)