Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi.Hidi/OpenApiService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ public static async Task TransformOpenApiDocumentAsync(HidiOptions options, ILog
throw new IOException($"The file {options.Output} already exists. Please input a new file path.");
}

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

// If ApiManifest is provided, set the referenced OpenAPI document
var apiDependency = await FindApiDependencyAsync(options.FilterOptions.FilterByApiManifest, logger, cancellationToken).ConfigureAwait(false);
Expand Down
6 changes: 5 additions & 1 deletion src/Microsoft.OpenApi.Hidi/OpenApiSpecVersionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ public static OpenApiSpecVersion TryParseOpenApiSpecVersion(string value)
{
return OpenApiSpecVersion.OpenApi3_1;
}
else if (majorVersion == 3 && minorVersion == 2)
{
return OpenApiSpecVersion.OpenApi3_2;
}

return OpenApiSpecVersion.OpenApi3_1; // default
return OpenApiSpecVersion.OpenApi3_2; // default
}
}
}
7 changes: 7 additions & 0 deletions src/Microsoft.OpenApi.Workbench/MainModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ public OpenApiSpecVersion Version
OnPropertyChanged(nameof(IsV2_0));
OnPropertyChanged(nameof(IsV3_0));
OnPropertyChanged(nameof(IsV3_1));
OnPropertyChanged(nameof(IsV3_2));
}
}

Expand Down Expand Up @@ -188,6 +189,12 @@ public bool IsV3_1
set => Version = value ? OpenApiSpecVersion.OpenApi3_1 : Version;
}

public bool IsV3_2
{
get => Version == OpenApiSpecVersion.OpenApi3_2;
set => Version = value ? OpenApiSpecVersion.OpenApi3_2 : Version;
}

/// <summary>
/// Handling method when the property with given name has changed.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ public static Task SerializeAsync<T>(this T element, IOpenApiWriter writer, Open

switch (specVersion)
{
case OpenApiSpecVersion.OpenApi3_2:
element.SerializeAsV32(writer);
break;

case OpenApiSpecVersion.OpenApi3_1:
element.SerializeAsV31(writer);
break;
Expand Down
5 changes: 5 additions & 0 deletions src/Microsoft.OpenApi/Interfaces/IOpenApiSerializable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ namespace Microsoft.OpenApi
/// </summary>
public interface IOpenApiSerializable : IOpenApiElement
{
/// <summary>
/// Serialize OpenAPI element into v3.2
/// </summary>
/// <param name="writer"></param>
void SerializeAsV32(IOpenApiWriter writer);
/// <summary>
/// Serialize OpenAPI element into v3.1
/// </summary>
Expand Down
15 changes: 15 additions & 0 deletions src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,27 @@ public BaseOpenApiReference(BaseOpenApiReference reference)
HostDocument = reference.HostDocument;
}

/// <inheritdoc/>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, SerializeAdditionalV32Properties);
}

/// <inheritdoc/>
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, SerializeAdditionalV31Properties);
}

/// <summary>
/// Serialize additional properties for Open Api v3.2.
/// </summary>
/// <param name="writer"></param>
protected virtual void SerializeAdditionalV32Properties(IOpenApiWriter writer)
{
// noop for the base type
}

/// <summary>
/// Serialize additional properties for Open Api v3.1.
/// </summary>
Expand Down
11 changes: 10 additions & 1 deletion src/Microsoft.OpenApi/Models/JsonSchemaReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,20 @@ public JsonSchemaReference(JsonSchemaReference reference) : base(reference)

/// <inheritdoc/>
protected override void SerializeAdditionalV31Properties(IOpenApiWriter writer)
{
SerializeAdditionalV3XProperties(writer, base.SerializeAdditionalV31Properties);
}
/// <inheritdoc/>
protected override void SerializeAdditionalV32Properties(IOpenApiWriter writer)
{
SerializeAdditionalV3XProperties(writer, base.SerializeAdditionalV32Properties);
}
private void SerializeAdditionalV3XProperties(IOpenApiWriter writer, Action<IOpenApiWriter> baseSerializer)
{
if (Type != ReferenceType.Schema) throw new InvalidOperationException(
$"JsonSchemaReference can only be serialized for ReferenceType.Schema, but was {Type}.");

base.SerializeAdditionalV31Properties(writer);
baseSerializer(writer);
// Additional schema metadata annotations in 3.1
writer.WriteOptionalObject(OpenApiConstants.Default, Default, (w, d) => w.WriteAny(d));
writer.WriteProperty(OpenApiConstants.Title, Title);
Expand Down
10 changes: 10 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiCallback.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ public void AddPathItem(RuntimeExpression expression, IOpenApiPathItem pathItem)
PathItems.Add(expression, pathItem);
}

/// <summary>
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.2
/// </summary>
/// <param name="writer"></param>
/// <exception cref="System.NotImplementedException"></exception>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.1
/// </summary>
Expand Down
22 changes: 17 additions & 5 deletions src/Microsoft.OpenApi/Models/OpenApiComponents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,19 +90,32 @@ public OpenApiComponents(OpenApiComponents? components)
Extensions = components?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(components.Extensions) : null;
}

/// <summary>
/// Serialize <see cref="OpenApiComponents"/> to Open API v3.2.
/// </summary>
/// <param name="writer"></param>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeAsV3X(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer), (writer, referenceElement) => referenceElement.SerializeAsV32(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiComponents"/> to Open API v3.1.
/// </summary>
/// <param name="writer"></param>
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeAsV3X(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer), (writer, referenceElement) => referenceElement.SerializeAsV31(writer));
}
private void SerializeAsV3X(IOpenApiWriter writer, OpenApiSpecVersion version, Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, IOpenApiReferenceHolder> action)
{
Utils.CheckArgumentNull(writer);

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

Expand All @@ -116,16 +129,15 @@ public virtual void SerializeAsV31(IOpenApiWriter writer)
{
if (component is OpenApiPathItemReference reference)
{
reference.SerializeAsV31(w);
action(w, reference);
}
else
{
component.SerializeAsV31(w);
callback(w, component);
}
});

SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer),
(writer, referenceElement) => referenceElement.SerializeAsV31(writer));
SerializeInternal(writer, version, callback, action);
}

/// <summary>
Expand Down
8 changes: 8 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiContact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ public OpenApiContact(OpenApiContact contact)
Email = contact?.Email ?? Email;
Extensions = contact?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(contact.Extensions) : null;
}
/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.2
/// </summary>
/// <param name="writer"></param>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_2);
}

/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.1
Expand Down
24 changes: 17 additions & 7 deletions src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,27 @@ public OpenApiDiscriminator(OpenApiDiscriminator discriminator)
Extensions = discriminator?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(discriminator.Extensions) : null;
}

/// <summary>
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v3.2
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2);

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_2);

writer.WriteEndObject();
}

/// <summary>
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v3.1
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer);
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1);

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_1);
Expand All @@ -59,16 +73,12 @@ public void SerializeAsV31(IOpenApiWriter writer)
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer);
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0);

writer.WriteEndObject();
}

/// <summary>
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v3.0
/// </summary>
/// <param name="writer"></param>
private void SerializeInternal(IOpenApiWriter writer)
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version)
{
Utils.CheckArgumentNull(writer);

Expand Down
25 changes: 21 additions & 4 deletions src/Microsoft.OpenApi/Models/OpenApiDocument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,28 +162,45 @@ public void SerializeAs(OpenApiSpecVersion version, IOpenApiWriter writer)
SerializeAsV31(writer);
break;

case OpenApiSpecVersion.OpenApi3_2:
SerializeAsV32(writer);
break;

default:
throw new ArgumentOutOfRangeException(nameof(version), version, string.Format(SRResource.OpenApiSpecVersionNotSupported, version));
}
}

/// <summary>
/// Serialize <see cref="OpenApiDocument"/> to Open API v3.2 document.
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV32(IOpenApiWriter writer)
{
SerializeAsV3X(writer, "3.2.0", OpenApiSpecVersion.OpenApi3_2, (w, element) => element.SerializeAsV32(w), (w, referenceElement) => referenceElement.SerializeAsV32(w));
}

/// <summary>
/// Serialize <see cref="OpenApiDocument"/> to Open API v3.1 document.
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV31(IOpenApiWriter writer)
{
SerializeAsV3X(writer, "3.1.2", OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w), (w, referenceElement) => referenceElement.SerializeAsV31(w));
}
private void SerializeAsV3X(IOpenApiWriter writer, string versionString, OpenApiSpecVersion version, Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, OpenApiPathItemReference> referenceCallback)
{
Utils.CheckArgumentNull(writer);

writer.WriteStartObject();

// openApi
writer.WriteProperty(OpenApiConstants.OpenApi, "3.1.1");
writer.WriteProperty(OpenApiConstants.OpenApi, versionString);

// jsonSchemaDialect
writer.WriteProperty(OpenApiConstants.JsonSchemaDialect, JsonSchemaDialect?.ToString());

SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w));
SerializeInternal(writer, version, callback);

// webhooks
writer.WriteOptionalMap(
Expand All @@ -193,11 +210,11 @@ public void SerializeAsV31(IOpenApiWriter writer)
{
if (component is OpenApiPathItemReference reference)
{
reference.SerializeAsV31(w);
referenceCallback(w, reference);
}
else
{
component.SerializeAsV31(w);
callback(w, component);
}
});

Expand Down
9 changes: 9 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiEncoding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@ public OpenApiEncoding(OpenApiEncoding encoding)
Extensions = encoding?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(encoding.Extensions) : null;
}

/// <summary>
/// Serialize <see cref="OpenApiEncoding"/> to Open Api v3.2
/// </summary>
/// <param name="writer"></param>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiEncoding"/> to Open Api v3.1
/// </summary>
Expand Down
6 changes: 6 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ internal OpenApiExample(IOpenApiExample example)
Extensions = example.Extensions != null ? new Dictionary<string, IOpenApiExtension>(example.Extensions) : null;
}

/// <inheritdoc/>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2);
}

/// <inheritdoc/>
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
Expand Down
8 changes: 8 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ protected OpenApiExtensibleDictionary(
/// </summary>
public IDictionary<string, IOpenApiExtension>? Extensions { get; set; }

/// <summary>
/// Serialize to Open Api v3.2
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer));
}

/// <summary>
/// Serialize to Open Api v3.1
Expand Down
8 changes: 8 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ public OpenApiExternalDocs(OpenApiExternalDocs externalDocs)
Extensions = externalDocs?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(externalDocs.Extensions) : null;
}

/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.2.
/// </summary>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_2);
}

/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.1.
/// </summary>
Expand Down
10 changes: 9 additions & 1 deletion src/Microsoft.OpenApi/Models/OpenApiHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,20 @@ internal OpenApiHeader(IOpenApiHeader header)
Extensions = header.Extensions != null ? new Dictionary<string, IOpenApiExtension>(header.Extensions) : null;
}

/// <summary>
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.2
/// </summary>
public virtual void SerializeAsV32(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2, (writer, element) => element.SerializeAsV32(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.1
/// </summary>
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV31(writer));
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}

/// <summary>
Expand Down
Loading
Loading