diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index fd74c2b57..a990ddcbb 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -165,50 +165,25 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio writer.WriteEndObject(); } - - /// - public void SerializeAsV2(IOpenApiWriter writer) + /// + /// Write the "in" property for V2 serialization. + /// + /// Writer to use for the serialization + internal virtual void WriteInPropertyForV2(IOpenApiWriter writer) { - Utils.CheckArgumentNull(writer); - - writer.WriteStartObject(); - - // in - if (this is OpenApiFormDataParameter) - { - writer.WriteProperty(OpenApiConstants.In, "formData"); - } - else if (this is OpenApiBodyParameter) - { - writer.WriteProperty(OpenApiConstants.In, "body"); - } - else - { - writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName()); - } - - // name - writer.WriteProperty(OpenApiConstants.Name, Name); - - // description - writer.WriteProperty(OpenApiConstants.Description, Description); - - // required - writer.WriteProperty(OpenApiConstants.Required, Required, false); - - // deprecated - writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false); - - var extensionsClone = Extensions is not null ? new Dictionary(Extensions) : null; + writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName()); + } - // schema - if (this is OpenApiBodyParameter) - { - writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => s.SerializeAsV2(w)); - } + /// + /// Write the request body schema for V2 serialization. + /// + /// Writer to use for the serialization + /// Extensions clone + internal virtual void WriteRequestBodySchemaForV2(IOpenApiWriter writer, Dictionary? extensionsClone) + { // In V2 parameter's type can't be a reference to a custom object schema or can't be of type object // So in that case map the type as string. - else if (Schema is OpenApiSchemaReference { UnresolvedReference: true } || (Schema?.Type & JsonSchemaType.Object) == JsonSchemaType.Object) + if (Schema is OpenApiSchemaReference { UnresolvedReference: true } || (Schema?.Type & JsonSchemaType.Object) == JsonSchemaType.Object) { writer.WriteProperty(OpenApiConstants.Type, "string"); } @@ -270,7 +245,34 @@ public void SerializeAsV2(IOpenApiWriter writer) } } } + } + + /// + public void SerializeAsV2(IOpenApiWriter writer) + { + Utils.CheckArgumentNull(writer); + + writer.WriteStartObject(); + + // in + WriteInPropertyForV2(writer); + // name + writer.WriteProperty(OpenApiConstants.Name, Name); + + // description + writer.WriteProperty(OpenApiConstants.Description, Description); + + // required + writer.WriteProperty(OpenApiConstants.Required, Required, false); + + // deprecated + writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false); + + var extensionsClone = Extensions is not null ? new Dictionary(Extensions) : null; + + // schema + WriteRequestBodySchemaForV2(writer, extensionsClone); //examples if (Examples != null && Examples.Any()) { @@ -315,6 +317,14 @@ public IOpenApiParameter CreateShallowCopy() /// internal class OpenApiBodyParameter : OpenApiParameter { + internal override void WriteRequestBodySchemaForV2(IOpenApiWriter writer, Dictionary? extensionsClone) + { + writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => s.SerializeAsV2(w)); + } + internal override void WriteInPropertyForV2(IOpenApiWriter writer) + { + writer.WriteProperty(OpenApiConstants.In, "body"); + } } /// @@ -322,5 +332,9 @@ internal class OpenApiBodyParameter : OpenApiParameter /// internal class OpenApiFormDataParameter : OpenApiParameter { + internal override void WriteInPropertyForV2(IOpenApiWriter writer) + { + writer.WriteProperty(OpenApiConstants.In, "formData"); + } } } diff --git a/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs b/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs index ea4f33f63..5d24b1f3b 100644 --- a/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs +++ b/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs @@ -19,12 +19,13 @@ public class FormattingStreamWriter : StreamWriter public FormattingStreamWriter(Stream stream, IFormatProvider formatProvider) : base(stream) { - this.FormatProvider = formatProvider; + _formatProvider = formatProvider; } + private readonly IFormatProvider _formatProvider; /// /// The associated with this . /// - public override IFormatProvider FormatProvider { get; } + public override IFormatProvider FormatProvider { get => _formatProvider; } } }