diff --git a/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs b/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs
index aca76f979..3a160b135 100644
--- a/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs
+++ b/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs
@@ -1,6 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
+using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.OpenApi.Exceptions;
@@ -13,7 +14,7 @@ namespace Microsoft.OpenApi.Extensions
///
/// Extension methods for resolving references on elements.
///
- public static class OpenApiReferencableExtensions
+ public static class OpenApiReferenceableExtensions
{
///
/// Resolves a JSON Pointer with respect to an element, returning the referenced element.
@@ -57,13 +58,15 @@ private static IOpenApiReferenceable ResolveReferenceOnHeaderElement(
string mapKey,
JsonPointer pointer)
{
- switch (propertyName)
+ if (OpenApiConstants.Examples.Equals(propertyName, StringComparison.Ordinal) &&
+ !string.IsNullOrEmpty(mapKey) &&
+ headerElement?.Examples != null &&
+ headerElement.Examples.TryGetValue(mapKey, out var exampleElement) &&
+ exampleElement is IOpenApiReferenceable referenceable)
{
- case OpenApiConstants.Examples when mapKey != null:
- return headerElement.Examples[mapKey];
- default:
- throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer));
+ return referenceable;
}
+ throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer));
}
private static IOpenApiReferenceable ResolveReferenceOnParameterElement(
@@ -72,13 +75,15 @@ private static IOpenApiReferenceable ResolveReferenceOnParameterElement(
string mapKey,
JsonPointer pointer)
{
- switch (propertyName)
+ if (OpenApiConstants.Examples.Equals(propertyName, StringComparison.Ordinal) &&
+ !string.IsNullOrEmpty(mapKey) &&
+ parameterElement?.Examples != null &&
+ parameterElement.Examples.TryGetValue(mapKey, out var exampleElement) &&
+ exampleElement is IOpenApiReferenceable referenceable)
{
- case OpenApiConstants.Examples when mapKey != null:
- return parameterElement.Examples[mapKey];
- default:
- throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer));
+ return referenceable;
}
+ throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer));
}
private static IOpenApiReferenceable ResolveReferenceOnResponseElement(
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs
new file mode 100644
index 000000000..367c84a96
--- /dev/null
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+
+namespace Microsoft.OpenApi.Interfaces;
+
+///
+/// Represents an Extensible Open API element elements can be rad from.
+///
+public interface IOpenApiReadOnlyExtensible
+{
+ ///
+ /// Specification extensions.
+ ///
+ IDictionary Extensions { get; }
+
+}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs
new file mode 100644
index 000000000..99b5dde2d
--- /dev/null
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs
@@ -0,0 +1,47 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.OpenApi.Models;
+
+namespace Microsoft.OpenApi.Interfaces
+{
+ ///
+ /// A generic interface for OpenApiReferenceable objects that have a target.
+ ///
+ /// Type of the target being referenced
+ public interface IOpenApiReferenceHolder : IOpenApiReferenceHolder where T : IOpenApiReferenceable
+ {
+ ///
+ /// Gets the resolved target object.
+ ///
+ T Target { get; }
+ }
+ ///
+ /// A generic interface for OpenApiReferenceable objects that have a target.
+ ///
+ /// The type of the target being referenced
+ /// The type of the interface implemented by both the target and the reference type
+ public interface IOpenApiReferenceHolder : IOpenApiReferenceHolder where T : IOpenApiReferenceable, V
+ {
+ //TODO merge this interface with the previous once all implementations are updated
+ ///
+ /// Copy the reference as a target element with overrides.
+ ///
+ V CopyReferenceAsTargetElementWithOverrides(V source);
+ }
+ ///
+ /// A generic interface for OpenApiReferenceable objects that have a target.
+ ///
+ public interface IOpenApiReferenceHolder : IOpenApiSerializable
+ {
+ ///
+ /// Indicates if object is populated with data or is just a reference to the data
+ ///
+ bool UnresolvedReference { get; set; }
+
+ ///
+ /// Reference object.
+ ///
+ OpenApiReference Reference { get; set; }
+ }
+}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
index 43088bf6b..38e888dc8 100644
--- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
@@ -1,8 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using Microsoft.OpenApi.Models;
-
namespace Microsoft.OpenApi.Interfaces
{
///
@@ -10,14 +8,5 @@ namespace Microsoft.OpenApi.Interfaces
///
public interface IOpenApiReferenceable : IOpenApiSerializable
{
- ///
- /// Indicates if object is populated with data or is just a reference to the data
- ///
- bool UnresolvedReference { get; set; }
-
- ///
- /// Reference object.
- ///
- OpenApiReference Reference { get; set; }
}
}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs
deleted file mode 100644
index fc4c1daed..000000000
--- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-namespace Microsoft.OpenApi.Interfaces
-{
- ///
- /// A generic interface for OpenApiReferenceable objects that have a target.
- ///
- ///
- public interface IOpenApiReferenceableWithTarget : IOpenApiReferenceable
- {
- ///
- /// Gets the resolved target object.
- ///
- T Target { get; }
- }
-}
diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs
new file mode 100644
index 000000000..76a945548
--- /dev/null
+++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs
@@ -0,0 +1,20 @@
+using Microsoft.OpenApi.Interfaces;
+
+namespace Microsoft.OpenApi.Models.Interfaces;
+
+///
+/// Describes an element that has a summary and description.
+///
+public interface IOpenApiDescribedElement : IOpenApiElement
+{
+ ///
+ /// Short description for the example.
+ ///
+ public string Summary { get; set; }
+
+ ///
+ /// Long description for the example.
+ /// CommonMark syntax MAY be used for rich text representation.
+ ///
+ public string Description { get; set; }
+}
diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs
new file mode 100644
index 000000000..3711df4b8
--- /dev/null
+++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs
@@ -0,0 +1,26 @@
+using System.Text.Json.Nodes;
+using Microsoft.OpenApi.Interfaces;
+
+namespace Microsoft.OpenApi.Models.Interfaces;
+
+///
+/// Defines the base properties for the example object.
+/// This interface is provided for type assertions but should not be implemented by package consumers beyond automatic mocking.
+///
+public interface IOpenApiExample : IOpenApiDescribedElement, IOpenApiSerializable, IOpenApiReadOnlyExtensible
+{
+ ///
+ /// Embedded literal example. The value field and externalValue field are mutually
+ /// exclusive. To represent examples of media types that cannot naturally represented
+ /// in JSON or YAML, use a string value to contain the example, escaping where necessary.
+ ///
+ public JsonNode Value { get; }
+
+ ///
+ /// A URL that points to the literal example.
+ /// This provides the capability to reference examples that cannot easily be
+ /// included in JSON or YAML documents.
+ /// The value field and externalValue field are mutually exclusive.
+ ///
+ public string ExternalValue { get; }
+}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
index 5b43b5187..6ca0089b4 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Writers;
@@ -35,7 +36,7 @@ public class OpenApiComponents : IOpenApiSerializable, IOpenApiExtensible
///
/// An object to hold reusable Objects.
///
- public virtual IDictionary? Examples { get; set; } = new Dictionary();
+ public virtual IDictionary? Examples { get; set; } = new Dictionary();
///
/// An object to hold reusable Objects.
@@ -87,7 +88,7 @@ public OpenApiComponents(OpenApiComponents? components)
Schemas = components?.Schemas != null ? new Dictionary(components.Schemas) : null;
Responses = components?.Responses != null ? new Dictionary(components.Responses) : null;
Parameters = components?.Parameters != null ? new Dictionary(components.Parameters) : null;
- Examples = components?.Examples != null ? new Dictionary(components.Examples) : null;
+ Examples = components?.Examples != null ? new Dictionary(components.Examples) : null;
RequestBodies = components?.RequestBodies != null ? new Dictionary(components.RequestBodies) : null;
Headers = components?.Headers != null ? new Dictionary(components.Headers) : null;
SecuritySchemes = components?.SecuritySchemes != null ? new Dictionary(components.SecuritySchemes) : null;
@@ -160,7 +161,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
/// Serialize .
///
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
- Action callback, Action action)
+ Action callback, Action action)
{
// Serialize each referenceable object as full object without reference if the reference in the object points to itself.
// If the reference exists but points to other objects, the object is serialized to just that reference.
diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
index 047062874..9b7099f56 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
@@ -11,6 +11,7 @@
using System.Threading.Tasks;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Services;
@@ -615,7 +616,7 @@ public bool AddComponent(string id, T componentToRegister)
Components.PathItems.Add(id, openApiPathItem);
break;
case OpenApiExample openApiExample:
- Components.Examples ??= new Dictionary();
+ Components.Examples ??= new Dictionary();
Components.Examples.Add(id, openApiExample);
break;
case OpenApiHeader openApiHeader:
@@ -645,9 +646,10 @@ public static void ResolveSchemas(OpenApiComponents? components, Dictionary
+ public override void Visit(IOpenApiReferenceHolder referenceHolder)
{
- switch (referenceable)
+ switch (referenceHolder)
{
case OpenApiSchema schema:
if (!Schemas.ContainsKey(schema.Reference.Id))
@@ -659,7 +661,7 @@ public override void Visit(IOpenApiReferenceable referenceable)
default:
break;
}
- base.Visit(referenceable);
+ base.Visit(referenceHolder);
}
public override void Visit(OpenApiSchema schema)
diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs
index 1fc7ca900..c35480fc2 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs
@@ -5,6 +5,7 @@
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models
@@ -12,48 +13,22 @@ namespace Microsoft.OpenApi.Models
///
/// Example Object.
///
- public class OpenApiExample : IOpenApiReferenceable, IOpenApiExtensible
+ public class OpenApiExample : IOpenApiReferenceable, IOpenApiExtensible, IOpenApiExample
{
- ///
- /// Short description for the example.
- ///
- public virtual string Summary { get; set; }
-
- ///
- /// Long description for the example.
- /// CommonMark syntax MAY be used for rich text representation.
- ///
- public virtual string Description { get; set; }
-
- ///
- /// Embedded literal example. The value field and externalValue field are mutually
- /// exclusive. To represent examples of media types that cannot naturally represented
- /// in JSON or YAML, use a string value to contain the example, escaping where necessary.
- ///
- public virtual JsonNode Value { get; set; }
+ ///
+ public string Summary { get; set; }
- ///
- /// A URL that points to the literal example.
- /// This provides the capability to reference examples that cannot easily be
- /// included in JSON or YAML documents.
- /// The value field and externalValue field are mutually exclusive.
- ///
- public virtual string ExternalValue { get; set; }
+ ///
+ public string Description { get; set; }
- ///
- /// This object MAY be extended with Specification Extensions.
- ///
- public virtual IDictionary Extensions { get; set; } = new Dictionary();
+ ///
+ public string ExternalValue { get; set; }
- ///
- /// Reference object.
- ///
- public virtual OpenApiReference Reference { get; set; }
+ ///
+ public JsonNode Value { get; set; }
- ///
- /// Indicates object is a placeholder reference to an actual object and does not contain valid data.
- ///
- public virtual bool UnresolvedReference { get; set; } = false;
+ ///
+ public IDictionary Extensions { get; set; } = new Dictionary();
///
/// Parameter-less constructor
@@ -63,41 +38,29 @@ public OpenApiExample() { }
///
/// Initializes a copy of object
///
- public OpenApiExample(OpenApiExample example)
+ /// The object
+ public OpenApiExample(IOpenApiExample example)
{
Summary = example?.Summary ?? Summary;
Description = example?.Description ?? Description;
Value = example?.Value != null ? JsonNodeCloneHelper.Clone(example.Value) : null;
ExternalValue = example?.ExternalValue ?? ExternalValue;
Extensions = example?.Extensions != null ? new Dictionary(example.Extensions) : null;
- Reference = example?.Reference != null ? new(example.Reference) : null;
- UnresolvedReference = example?.UnresolvedReference ?? UnresolvedReference;
}
- ///
- /// Serialize to Open Api v3.1
- ///
- ///
- public virtual void SerializeAsV31(IOpenApiWriter writer)
+ ///
+ public void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1);
}
- ///
- /// Serialize to Open Api v3.0
- ///
- ///
- public virtual void SerializeAsV3(IOpenApiWriter writer)
+ ///
+ public void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0);
}
- ///
- /// Writes out existing examples in a mediatype object
- ///
- ///
- ///
- public void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version)
+ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version)
{
Utils.CheckArgumentNull(writer);
@@ -121,14 +84,10 @@ public void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version)
writer.WriteEndObject();
}
- ///
- /// Serialize to Open Api v2.0
- ///
- public virtual void SerializeAsV2(IOpenApiWriter writer)
+ ///
+ public void SerializeAsV2(IOpenApiWriter writer)
{
- // Example object of this form does not exist in V2.
- // V2 Example object requires knowledge of media type and exists only
- // in Response object, so it will be serialized as a part of the Response object.
+ SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0);
}
}
}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs
index 268878b1b..c27d18f8d 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs
@@ -7,6 +7,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models
@@ -82,7 +83,7 @@ public virtual OpenApiSchema Schema
///
/// Examples of the media type.
///
- public virtual IDictionary Examples { get; set; } = new Dictionary();
+ public virtual IDictionary Examples { get; set; } = new Dictionary();
///
/// A map containing the representations for the header.
@@ -115,7 +116,7 @@ public OpenApiHeader(OpenApiHeader header)
AllowReserved = header?.AllowReserved ?? AllowReserved;
_schema = header?.Schema != null ? new(header.Schema) : null;
Example = header?.Example != null ? JsonNodeCloneHelper.Clone(header.Example) : null;
- Examples = header?.Examples != null ? new Dictionary(header.Examples) : null;
+ Examples = header?.Examples != null ? new Dictionary(header.Examples) : null;
Content = header?.Content != null ? new Dictionary(header.Content) : null;
Extensions = header?.Extensions != null ? new Dictionary(header.Extensions) : null;
}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
index 671a0dcfc..23acd0de9 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
@@ -7,6 +7,7 @@
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
#nullable enable
@@ -39,7 +40,7 @@ public virtual OpenApiSchema? Schema
/// Examples of the media type.
/// Each example object SHOULD match the media type and specified schema if present.
///
- public IDictionary? Examples { get; set; } = new Dictionary();
+ public IDictionary? Examples { get; set; } = new Dictionary();
///
/// A map between a property name and its encoding information.
@@ -66,7 +67,7 @@ public OpenApiMediaType(OpenApiMediaType? mediaType)
{
_schema = mediaType?.Schema != null ? new(mediaType.Schema) : null;
Example = mediaType?.Example != null ? JsonNodeCloneHelper.Clone(mediaType.Example) : null;
- Examples = mediaType?.Examples != null ? new Dictionary(mediaType.Examples) : null;
+ Examples = mediaType?.Examples != null ? new Dictionary(mediaType.Examples) : null;
Encoding = mediaType?.Encoding != null ? new Dictionary(mediaType.Encoding) : null;
Extensions = mediaType?.Extensions != null ? new Dictionary(mediaType.Extensions) : null;
}
@@ -126,7 +127,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
// Media type does not exist in V2.
}
- private static void SerializeExamples(IOpenApiWriter writer, IDictionary examples)
+ private static void SerializeExamples(IOpenApiWriter writer, IDictionary examples)
{
/* Special case for writing out empty arrays as valid response examples
* Check if there is any example with an empty array as its value and set the flag `hasEmptyArray` to true
diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
index bdaba739e..66d03746e 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
@@ -8,6 +8,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models
@@ -120,7 +121,7 @@ public virtual OpenApiSchema Schema
/// Furthermore, if referencing a schema which contains an example,
/// the examples value SHALL override the example provided by the schema.
///
- public virtual IDictionary Examples { get; set; } = new Dictionary();
+ public virtual IDictionary Examples { get; set; } = new Dictionary();
///
/// Example of the media type. The example SHOULD match the specified schema and encoding properties
@@ -168,7 +169,7 @@ public OpenApiParameter(OpenApiParameter parameter)
Explode = parameter?.Explode ?? Explode;
AllowReserved = parameter?.AllowReserved ?? AllowReserved;
_schema = parameter?.Schema != null ? new(parameter.Schema) : null;
- Examples = parameter?.Examples != null ? new Dictionary(parameter.Examples) : null;
+ Examples = parameter?.Examples != null ? new Dictionary(parameter.Examples) : null;
Example = parameter?.Example != null ? JsonNodeCloneHelper.Clone(parameter.Example) : null;
Content = parameter?.Content != null ? new Dictionary(parameter.Content) : null;
Extensions = parameter?.Extensions != null ? new Dictionary(parameter.Extensions) : null;
@@ -358,7 +359,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
foreach (var example in Examples)
{
writer.WritePropertyName(example.Key);
- example.Value.SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0);
+ example.Value.SerializeAsV2(writer);
}
writer.WriteEndObject();
}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs
index 8a1ae4a43..9c65bf9e2 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs
@@ -200,7 +200,7 @@ private void SerializeInternal(IOpenApiWriter writer)
///
public void SerializeAsV2(IOpenApiWriter writer)
{
- Utils.CheckArgumentNull(writer);;
+ Utils.CheckArgumentNull(writer);
if (Type == ReferenceType.Tag)
{
diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs
index 2fab33fd5..0aed7bb0d 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs
@@ -162,7 +162,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
.SelectMany(mediaTypePair => mediaTypePair.Value.Examples))
{
writer.WritePropertyName(example.Key);
- example.Value.SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0);
+ example.Value.SerializeAsV2(writer);
}
writer.WriteEndObject();
diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
index dcab7de86..ff5a8eb48 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
@@ -15,8 +15,8 @@ namespace Microsoft.OpenApi.Models
///
/// The Schema Object allows the definition of input and output data types.
///
- public class OpenApiSchema : IOpenApiAnnotatable, IOpenApiExtensible, IOpenApiReferenceable
- {
+ public class OpenApiSchema : IOpenApiAnnotatable, IOpenApiExtensible, IOpenApiReferenceable, IOpenApiReferenceHolder
+ {//TODO remove the implementation of IOpenAPiReferenceHolder when we have removed the inheritance from the inheritance type to this type
///
/// Follow JSON Schema definition. Short text providing information about the data.
///
@@ -411,9 +411,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer)
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
-///
-
- public void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
+ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
Action callback)
{
writer.WriteStartObject();
diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs
index 58fa99694..057cf6d49 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models
///
/// Tag Object.
///
- public class OpenApiTag : IOpenApiSerializable, IOpenApiExtensible
+ public class OpenApiTag : IOpenApiReferenceable, IOpenApiExtensible
{
///
/// The name of the tag.
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
index 81985cb12..13cea041a 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
@@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Callback Object Reference: A reference to a map of possible out-of band callbacks related to the parent operation.
///
- public class OpenApiCallbackReference : OpenApiCallback, IOpenApiReferenceableWithTarget
+ public class OpenApiCallbackReference : OpenApiCallback, IOpenApiReferenceHolder
{
#nullable enable
internal OpenApiCallback _target;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
index c36c43d9a..0f8638c3e 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models.References
@@ -12,12 +13,14 @@ namespace Microsoft.OpenApi.Models.References
///
/// Example Object Reference.
///
- public class OpenApiExampleReference : OpenApiExample, IOpenApiReferenceableWithTarget
+ public class OpenApiExampleReference : IOpenApiReferenceHolder, IOpenApiExample
{
+ ///
+ public OpenApiReference Reference { get; set; }
+
+ ///
+ public bool UnresolvedReference { get; set; } = false;
internal OpenApiExample _target;
- private readonly OpenApiReference _reference;
- private string _summary;
- private string _description;
///
/// Gets the target example.
@@ -29,11 +32,8 @@ public OpenApiExample Target
{
get
{
- _target ??= Reference.HostDocument.ResolveReferenceTo(_reference);
- OpenApiExample resolved = new OpenApiExample(_target);
- if (!string.IsNullOrEmpty(_description)) resolved.Description = _description;
- if (!string.IsNullOrEmpty(_summary)) resolved.Summary = _summary;
- return resolved;
+ _target ??= Reference.HostDocument.ResolveReferenceTo(Reference);
+ return _target;
}
}
@@ -51,22 +51,33 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument,
{
Utils.CheckArgumentNullOrEmpty(referenceId);
- _reference = new OpenApiReference()
+ Reference = new OpenApiReference()
{
Id = referenceId,
HostDocument = hostDocument,
Type = ReferenceType.Example,
ExternalResource = externalResource
};
+ }
- Reference = _reference;
+ ///
+ /// Copy constructor
+ ///
+ /// The reference to copy.
+ public OpenApiExampleReference(OpenApiExampleReference example)
+ {
+ Utils.CheckArgumentNull(example);
+ Reference = example?.Reference != null ? new(example.Reference) : null;
+ UnresolvedReference = example?.UnresolvedReference ?? UnresolvedReference;
+ //no need to copy summary and description as if they are not overridden, they will be fetched from the target
+ //if they are, the reference copy will handle it
}
internal OpenApiExampleReference(OpenApiExample target, string referenceId)
{
_target = target;
- _reference = new OpenApiReference()
+ Reference = new OpenApiReference()
{
Id = referenceId,
Type = ReferenceType.Example,
@@ -74,59 +85,82 @@ internal OpenApiExampleReference(OpenApiExample target, string referenceId)
}
///
- public override string Description
+ public string Description
{
- get => string.IsNullOrEmpty(_description) ? Target.Description : _description;
- set => _description = value;
+ get => string.IsNullOrEmpty(Reference?.Description) ? Target?.Description : Reference.Description;
+ set
+ {
+ if (Reference is not null)
+ {
+ Reference.Description = value;
+ }
+ }
}
///
- public override string Summary
+ public string Summary
{
- get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary;
- set => _summary = value;
+ get => string.IsNullOrEmpty(Reference?.Summary) ? Target?.Summary : Reference.Summary;
+ set
+ {
+ if (Reference is not null)
+ {
+ Reference.Summary = value;
+ }
+ }
}
///
- public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; }
+ public IDictionary Extensions { get => Target?.Extensions; }
///
- public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; }
+ public string ExternalValue { get => Target?.ExternalValue; }
///
- public override JsonNode Value { get => Target.Value; set => Target.Value = value; }
+ public JsonNode Value { get => Target?.Value; }
///
- public override void SerializeAsV3(IOpenApiWriter writer)
+ public void SerializeAsV3(IOpenApiWriter writer)
{
- if (!writer.GetSettings().ShouldInlineReference(_reference))
+ if (!writer.GetSettings().ShouldInlineReference(Reference))
{
- _reference.SerializeAsV3(writer);
- return;
+ Reference.SerializeAsV3(writer);
}
else
{
- SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3(writer));
+ SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV3(writer));
}
}
///
- public override void SerializeAsV31(IOpenApiWriter writer)
+ public void SerializeAsV31(IOpenApiWriter writer)
{
- if (!writer.GetSettings().ShouldInlineReference(_reference))
+ if (!writer.GetSettings().ShouldInlineReference(Reference))
{
- _reference.SerializeAsV31(writer);
- return;
+ Reference.SerializeAsV31(writer);
}
else
{
- SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV31(writer));
+ SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV31(writer));
}
}
+
+ ///
+ public IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample openApiExample)
+ {
+ return openApiExample is OpenApiExample ? new OpenApiExample(this) : openApiExample;
+ }
+
+ ///
+ public void SerializeAsV2(IOpenApiWriter writer)
+ {
+ // examples components are not supported in OAS 2.0
+ Reference.SerializeAsV2(writer);
+ }
///
private void SerializeInternal(IOpenApiWriter writer,
- Action action)
+ Action action)
{
Utils.CheckArgumentNull(writer);
action(writer, Target);
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
index e8275c23c..d9f451c0a 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models.References
@@ -12,7 +13,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Header Object Reference.
///
- public class OpenApiHeaderReference : OpenApiHeader, IOpenApiReferenceableWithTarget
+ public class OpenApiHeaderReference : OpenApiHeader, IOpenApiReferenceHolder
{
internal OpenApiHeader _target;
private readonly OpenApiReference _reference;
@@ -103,7 +104,7 @@ public override string Description
public override JsonNode Example { get => Target.Example; set => Target.Example = value; }
///
- public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; }
+ public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; }
///
public override IDictionary Content { get => Target.Content; set => Target.Content = value; }
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
index 05817ddc9..614ab1446 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Link Object Reference.
///
- public class OpenApiLinkReference : OpenApiLink, IOpenApiReferenceableWithTarget
+ public class OpenApiLinkReference : OpenApiLink, IOpenApiReferenceHolder
{
internal OpenApiLink _target;
private readonly OpenApiReference _reference;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
index 9df1e7be2..93d1163db 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Models.References
@@ -12,7 +13,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Parameter Object Reference.
///
- public class OpenApiParameterReference : OpenApiParameter, IOpenApiReferenceableWithTarget
+ public class OpenApiParameterReference : OpenApiParameter, IOpenApiReferenceHolder
{
internal OpenApiParameter _target;
private readonly OpenApiReference _reference;
@@ -99,7 +100,7 @@ public override string Description
public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; }
///
- public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; }
+ public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; }
///
public override JsonNode Example { get => Target.Example; set => Target.Example = value; }
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
index fad8922ae..bc7e8904e 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Path Item Object Reference: to describe the operations available on a single path.
///
- public class OpenApiPathItemReference : OpenApiPathItem, IOpenApiReferenceableWithTarget
+ public class OpenApiPathItemReference : OpenApiPathItem, IOpenApiReferenceHolder
{
internal OpenApiPathItem _target;
private readonly OpenApiReference _reference;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
index 59fb27724..7025ec373 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Request Body Object Reference.
///
- public class OpenApiRequestBodyReference : OpenApiRequestBody, IOpenApiReferenceableWithTarget
+ public class OpenApiRequestBodyReference : OpenApiRequestBody, IOpenApiReferenceHolder
{
internal OpenApiRequestBody _target;
private readonly OpenApiReference _reference;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
index 2ac8aee27..0983bd3b6 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Response Object Reference.
///
- public class OpenApiResponseReference : OpenApiResponse, IOpenApiReferenceableWithTarget
+ public class OpenApiResponseReference : OpenApiResponse, IOpenApiReferenceHolder
{
internal OpenApiResponse _target;
private readonly OpenApiReference _reference;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
index da2f9b745..731f9c1af 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
@@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Schema reference object
///
- public class OpenApiSchemaReference : OpenApiSchema, IOpenApiReferenceableWithTarget
+ public class OpenApiSchemaReference : OpenApiSchema, IOpenApiReferenceHolder
{
#nullable enable
private OpenApiSchema? _target;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
index dcd5009b1..c1dafa80f 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Security Scheme Object Reference.
///
- public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceableWithTarget
+ public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceHolder
{
internal OpenApiSecurityScheme _target;
private readonly OpenApiReference _reference;
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
index ae15b4085..09afa3655 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
@@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Tag Object Reference
///
- public class OpenApiTagReference : OpenApiTag, IOpenApiReferenceableWithTarget
+ public class OpenApiTagReference : OpenApiTag, IOpenApiReferenceHolder
{
internal OpenApiTag _target;
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
index f39d9c345..d8740857b 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
@@ -120,7 +120,7 @@ public override string GetRaw()
}
public T GetReferencedObject(ReferenceType referenceType, string referenceId, string summary = null, string description = null)
- where T : IOpenApiReferenceable, new()
+ where T : IOpenApiReferenceHolder, new()
{
return new()
{
diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs
index bb66cf9b2..8690735b8 100644
--- a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs
+++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs
@@ -26,13 +26,10 @@ public IEnumerable References
}
}
- ///
- /// Collect reference for each reference
- ///
- ///
- public override void Visit(IOpenApiReferenceable referenceable)
+ ///
+ public override void Visit(IOpenApiReferenceHolder referenceHolder)
{
- AddExternalReferences(referenceable.Reference);
+ AddExternalReferences(referenceHolder.Reference);
}
///
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
index 6a5411070..247d68679 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
@@ -6,6 +6,7 @@
using System.Globalization;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -215,7 +216,7 @@ public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBod
}
// load examples from storage and add them to the parameter
- var examples = node.Context.GetFromTempStorage>(TempStorageKeys.Examples, parameter);
+ var examples = node.Context.GetFromTempStorage>(TempStorageKeys.Examples, parameter);
if (examples != null)
{
parameter.Examples = examples;
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
index 11b12e8f8..2716c499b 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -74,8 +75,8 @@ private static void ProcessProduces(MapNode mapNode, OpenApiResponse response, P
?? context.DefaultContentType ?? new List { "application/octet-stream" };
var schema = context.GetFromTempStorage(TempStorageKeys.ResponseSchema, response);
- var examples = context.GetFromTempStorage>(TempStorageKeys.Examples, response)
- ?? new Dictionary();
+ var examples = context.GetFromTempStorage>(TempStorageKeys.Examples, response)
+ ?? new Dictionary();
foreach (var produce in produces)
{
@@ -110,10 +111,10 @@ private static void LoadResponseExamplesExtension(OpenApiResponse response, Pars
node.Context.SetTempStorage(TempStorageKeys.Examples, examples, response);
}
- private static Dictionary LoadExamplesExtension(ParseNode node)
+ private static Dictionary LoadExamplesExtension(ParseNode node)
{
var mapNode = node.CheckMapNode(OpenApiConstants.ExamplesExtension);
- var examples = new Dictionary();
+ var examples = new Dictionary();
foreach (var examplesNode in mapNode)
{
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
index 06d1d284a..344565884 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
@@ -3,6 +3,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -40,7 +41,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
+ public static IOpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("example");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
index 69fc53179..b30dc88e0 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
@@ -3,6 +3,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Reader.ParseNodes;
namespace Microsoft.OpenApi.Reader.V3
@@ -51,7 +52,7 @@ internal static partial class OpenApiV3Deserializer
}
};
- private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields =
+ private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields =
new()
{
{
@@ -59,7 +60,7 @@ internal static partial class OpenApiV3Deserializer
new(
m => m.Examples,
e => e.Value,
- (e, v) => e.Value = v,
+ (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}},
m => m.Schema)
}
};
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
index a71f633e5..915314d35 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
@@ -3,6 +3,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -101,7 +102,7 @@ internal static partial class OpenApiV3Deserializer
}
};
- private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields =
+ private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields =
new()
{
{
@@ -109,7 +110,7 @@ internal static partial class OpenApiV3Deserializer
new(
m => m.Examples,
e => e.Value,
- (e, v) => e.Value = v,
+ (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}},
m => m.Schema)
}
};
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
index 820c58985..f6511d8b9 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
@@ -1,5 +1,6 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -46,7 +47,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
+ public static IOpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("example");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
index 36f90383c..a9024f9ed 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
@@ -1,5 +1,6 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Reader.ParseNodes;
namespace Microsoft.OpenApi.Reader.V31
@@ -57,15 +58,15 @@ internal static partial class OpenApiV31Deserializer
};
- private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields =
- new AnyMapFieldMap
+ private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields =
+ new AnyMapFieldMap
{
{
OpenApiConstants.Examples,
- new AnyMapFieldMapParameter(
+ new AnyMapFieldMapParameter(
m => m.Examples,
e => e.Value,
- (e, v) => e.Value = v,
+ (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}},
m => m.Schema)
}
};
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
index 7a2c3d90e..fecaf58c2 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
@@ -1,5 +1,6 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -119,15 +120,15 @@ internal static partial class OpenApiV31Deserializer
}
};
- private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields =
- new AnyMapFieldMap
+ private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields =
+ new AnyMapFieldMap
{
{
OpenApiConstants.Examples,
- new AnyMapFieldMapParameter(
+ new AnyMapFieldMapParameter(
m => m.Examples,
e => e.Value,
- (e, v) => e.Value = v,
+ (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}},
m => m.Schema)
}
};
diff --git a/src/Microsoft.OpenApi/Services/CopyReferences.cs b/src/Microsoft.OpenApi/Services/CopyReferences.cs
index 22f1c5ad3..086961a94 100644
--- a/src/Microsoft.OpenApi/Services/CopyReferences.cs
+++ b/src/Microsoft.OpenApi/Services/CopyReferences.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
namespace Microsoft.OpenApi.Services;
@@ -12,13 +13,10 @@ internal class CopyReferences(OpenApiDocument target) : OpenApiVisitorBase
private readonly OpenApiDocument _target = target;
public OpenApiComponents Components = new();
- ///
- /// Visits IOpenApiReferenceable instances that are references and not in components.
- ///
- /// An IOpenApiReferenceable object.
- public override void Visit(IOpenApiReferenceable referenceable)
+ ///
+ public override void Visit(IOpenApiReferenceHolder referenceHolder)
{
- switch (referenceable)
+ switch (referenceHolder)
{
case OpenApiSchemaReference openApiSchemaReference:
AddSchemaToComponents(openApiSchemaReference.Target, openApiSchemaReference.Reference.Id);
@@ -84,7 +82,7 @@ public override void Visit(IOpenApiReferenceable referenceable)
break;
}
- base.Visit(referenceable);
+ base.Visit(referenceHolder);
}
private void AddSchemaToComponents(OpenApiSchema schema, string referenceId = null)
@@ -156,9 +154,9 @@ private void AddExampleToComponents(OpenApiExample example, string referenceId =
{
EnsureComponentsExist();
EnsureExamplesExist();
- if (!Components.Examples.ContainsKey(referenceId ?? example.Reference.Id))
+ if (!Components.Examples.ContainsKey(referenceId))
{
- Components.Examples.Add(referenceId ?? example.Reference.Id, example);
+ Components.Examples.Add(referenceId, example);
}
}
private void AddPathItemToComponents(OpenApiPathItem pathItem, string referenceId = null)
@@ -222,7 +220,7 @@ private void EnsureRequestBodiesExist()
private void EnsureExamplesExist()
{
- _target.Components.Examples ??= new Dictionary();
+ _target.Components.Examples ??= new Dictionary();
}
private void EnsureHeadersExist()
diff --git a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
index a889628b3..8f0c24de5 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
@@ -7,6 +7,7 @@
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
namespace Microsoft.OpenApi.Services
@@ -210,7 +211,7 @@ public virtual void Visit(OpenApiEncoding encoding)
///
/// Visits the examples.
///
- public virtual void Visit(IDictionary examples)
+ public virtual void Visit(IDictionary examples)
{
}
@@ -299,9 +300,9 @@ public virtual void Visit(OpenApiSecurityScheme securityScheme)
}
///
- /// Visits
+ /// Visits
///
- public virtual void Visit(OpenApiExample example)
+ public virtual void Visit(IOpenApiExample example)
{
}
@@ -341,9 +342,9 @@ public virtual void Visit(IOpenApiExtension openApiExtension)
}
///
- /// Visits list of
+ /// Visits list of
///
- public virtual void Visit(IList example)
+ public virtual void Visit(IList example)
{
}
@@ -365,8 +366,8 @@ public virtual void Visit(IDictionary encodings)
///
/// Visits IOpenApiReferenceable instances that are references and not in components
///
- /// referenced object
- public virtual void Visit(IOpenApiReferenceable referenceable)
+ /// Referencing object
+ public virtual void Visit(IOpenApiReferenceHolder referenceHolder)
{
}
}
diff --git a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
index 9321b3b17..94a263bd0 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
@@ -8,6 +8,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Models.References;
namespace Microsoft.OpenApi.Services
@@ -17,7 +18,6 @@ namespace Microsoft.OpenApi.Services
///
public class OpenApiWalker
{
- private OpenApiDocument _hostDocument;
private readonly OpenApiVisitorBase _visitor;
private readonly Stack _schemaLoop = new();
private readonly Stack _pathItemLoop = new();
@@ -41,7 +41,6 @@ public void Walk(OpenApiDocument doc)
return;
}
- _hostDocument = doc;
_schemaLoop.Clear();
_pathItemLoop.Clear();
@@ -416,9 +415,9 @@ internal void Walk(OpenApiCallback callback, bool isComponent = false)
return;
}
- if (callback is OpenApiCallbackReference)
+ if (callback is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(callback as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -461,7 +460,10 @@ internal void Walk(OpenApiTagReference tag)
return;
}
- Walk(tag as IOpenApiReferenceable);
+ if (tag is IOpenApiReferenceHolder openApiReferenceHolder)
+ {
+ Walk(openApiReferenceHolder);
+ }
}
///
@@ -526,9 +528,9 @@ internal void Walk(OpenApiPathItem pathItem, bool isComponent = false)
return;
}
- if (pathItem is OpenApiPathItemReference)
+ if (pathItem is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(pathItem as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -649,9 +651,9 @@ internal void Walk(OpenApiParameter parameter, bool isComponent = false)
return;
}
- if (parameter is OpenApiParameterReference)
+ if (parameter is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(parameter as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -697,9 +699,9 @@ internal void Walk(OpenApiResponse response, bool isComponent = false)
return;
}
- if (response is OpenApiResponseReference)
+ if (response is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(response as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -720,9 +722,9 @@ internal void Walk(OpenApiRequestBody requestBody, bool isComponent = false)
return;
}
- if (requestBody is OpenApiRequestBodyReference)
+ if (requestBody is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(requestBody as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -932,9 +934,9 @@ internal void Walk(OpenApiSchema schema, bool isComponent = false)
///
- /// Visits dictionary of
+ /// Visits dictionary of
///
- internal void Walk(IDictionary examples)
+ internal void Walk(IDictionary examples)
{
if (examples == null)
{
@@ -968,18 +970,18 @@ internal void Walk(JsonNode example)
}
///
- /// Visits and child objects
+ /// Visits and child objects
///
- internal void Walk(OpenApiExample example, bool isComponent = false)
+ internal void Walk(IOpenApiExample example, bool isComponent = false)
{
if (example == null)
{
return;
}
- if (example is OpenApiExampleReference)
+ if (example is OpenApiExampleReference reference)
{
- Walk(example as IOpenApiReferenceable);
+ Walk(reference);
return;
}
@@ -988,9 +990,9 @@ internal void Walk(OpenApiExample example, bool isComponent = false)
}
///
- /// Visits the list of and child objects
+ /// Visits the list of and child objects
///
- internal void Walk(IList examples)
+ internal void Walk(IList examples)
{
if (examples == null)
{
@@ -1089,9 +1091,9 @@ internal void Walk(OpenApiLink link, bool isComponent = false)
return;
}
- if (link is OpenApiLinkReference)
+ if (link is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(link as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -1110,9 +1112,9 @@ internal void Walk(OpenApiHeader header, bool isComponent = false)
return;
}
- if (header is OpenApiHeaderReference)
+ if (header is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(header as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -1153,9 +1155,9 @@ internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = fals
return;
}
- if (securityScheme is OpenApiSecuritySchemeReference)
+ if (securityScheme is IOpenApiReferenceHolder openApiReferenceHolder)
{
- Walk(securityScheme as IOpenApiReferenceable);
+ Walk(openApiReferenceHolder);
return;
}
@@ -1166,9 +1168,9 @@ internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = fals
///
/// Visits and child objects
///
- internal void Walk(IOpenApiReferenceable referenceable)
+ internal void Walk(IOpenApiReferenceHolder referenceableHolder)
{
- _visitor.Visit(referenceable);
+ _visitor.Visit(referenceableHolder);
}
///
@@ -1191,8 +1193,8 @@ internal void Walk(IOpenApiElement element)
case OpenApiContact e: Walk(e); break;
case OpenApiCallback e: Walk(e); break;
case OpenApiEncoding e: Walk(e); break;
- case OpenApiExample e: Walk(e); break;
- case IDictionary e: Walk(e); break;
+ case IOpenApiExample e: Walk(e); break;
+ case IDictionary e: Walk(e); break;
case OpenApiExternalDocs e: Walk(e); break;
case OpenApiHeader e: Walk(e); break;
case OpenApiLink e: Walk(e); break;
@@ -1232,13 +1234,13 @@ private void Walk(string context, Action walk)
///
/// Identify if an element is just a reference to a component, or an actual component
///
- private bool ProcessAsReference(IOpenApiReferenceable referenceable, bool isComponent = false)
+ private bool ProcessAsReference(IOpenApiReferenceHolder referenceableHolder, bool isComponent = false)
{
- var isReference = referenceable.Reference != null &&
- (!isComponent || referenceable.UnresolvedReference);
+ var isReference = referenceableHolder.Reference != null &&
+ (!isComponent || referenceableHolder.UnresolvedReference);
if (isReference)
{
- Walk(referenceable);
+ Walk(referenceableHolder);
}
return isReference;
}
diff --git a/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs b/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs
index 1d9bb8e8e..146c8941d 100644
--- a/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs
+++ b/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs
@@ -18,15 +18,12 @@ public ReferenceHostDocumentSetter(OpenApiDocument currentDocument)
_currentDocument = currentDocument;
}
- ///
- /// Visits the referenceable element in the host document
- ///
- /// The referenceable element in the doc.
- public override void Visit(IOpenApiReferenceable referenceable)
+ ///
+ public override void Visit(IOpenApiReferenceHolder referenceHolder)
{
- if (referenceable.Reference != null)
+ if (referenceHolder.Reference != null)
{
- referenceable.Reference.HostDocument = _currentDocument;
+ referenceHolder.Reference.HostDocument = _currentDocument;
}
}
}
diff --git a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs
index 7281ef258..0cc7ade2b 100644
--- a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs
+++ b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs
@@ -6,6 +6,7 @@
using System.Collections.Generic;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Services;
namespace Microsoft.OpenApi.Validations
@@ -125,7 +126,7 @@ public void AddWarning(OpenApiValidatorWarning warning)
public override void Visit(IOpenApiExtension openApiExtension) => Validate(openApiExtension, openApiExtension.GetType());
///
- public override void Visit(IList example) => Validate(example, example.GetType());
+ public override void Visit(IList example) => Validate(example, example.GetType());
///
public override void Visit(OpenApiPathItem pathItem) => Validate(pathItem);
@@ -149,7 +150,7 @@ public void AddWarning(OpenApiValidatorWarning warning)
public override void Visit(OpenApiLink link) => Validate(link);
///
- public override void Visit(OpenApiExample example) => Validate(example);
+ public override void Visit(IOpenApiExample example) => Validate(example);
///
public override void Visit(OpenApiOperation operation) => Validate(operation);
@@ -162,7 +163,7 @@ public void AddWarning(OpenApiValidatorWarning warning)
///
public override void Visit(IDictionary content) => Validate(content, content.GetType());
///
- public override void Visit(IDictionary examples) => Validate(examples, examples.GetType());
+ public override void Visit(IDictionary examples) => Validate(examples, examples.GetType());
///
public override void Visit(IDictionary links) => Validate(links, links.GetType());
///
@@ -189,9 +190,9 @@ private void Validate(object item, Type type)
}
// Validate unresolved references as references
- if (item is IOpenApiReferenceable { UnresolvedReference: true })
+ if (item is IOpenApiReferenceHolder { UnresolvedReference: true })
{
- type = typeof(IOpenApiReferenceable);
+ type = typeof(IOpenApiReferenceHolder);
}
var rules = _ruleSet.FindRules(type);
diff --git a/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs b/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs
index f02be33ee..759aafe47 100644
--- a/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs
+++ b/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs
@@ -5,6 +5,7 @@
using System.Linq;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
namespace Microsoft.OpenApi.Validations.Rules
{
@@ -89,7 +90,7 @@ public static class OpenApiNonDefaultRules
private static void ValidateMismatchedDataType(IValidationContext context,
string ruleName,
JsonNode example,
- IDictionary examples,
+ IDictionary examples,
OpenApiSchema schema)
{
// example
diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
index 77f2c9ae9..e8c49bbc8 100644
--- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
+++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
@@ -3,6 +3,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Services;
using Microsoft.OpenApi.Tests.UtilityFiles;
using Moq;
@@ -243,7 +244,8 @@ public async Task CopiesOverAllReferencedComponentsToTheSubsetDocumentCorrectly(
// Assert
Assert.Same(doc.Servers, subsetOpenApiDocument.Servers);
Assert.False(responseHeader?.UnresolvedReference);
- Assert.False(mediaTypeExample?.UnresolvedReference);
+ var exampleReference = Assert.IsType(mediaTypeExample);
+ Assert.False(exampleReference?.UnresolvedReference);
Assert.NotNull(targetHeaders);
Assert.Single(targetHeaders);
Assert.NotNull(targetExamples);
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
index a46b32f09..41f2c6a1e 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
@@ -1147,7 +1147,7 @@ public async Task HeaderParameterShouldAllowExample()
AllowReserved = true,
Style = ParameterStyle.Simple,
Explode = true,
- Examples = new Dictionary()
+ Examples =
{
{ "uuid1", new OpenApiExample()
{
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
index e3c1435fd..e10c78a25 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
@@ -57,11 +57,11 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed()
{
Examples =
{
- ["example1"] = new()
+ ["example1"] = new OpenApiExample()
{
Value = 5
},
- ["example2"] = new()
+ ["example2"] = new OpenApiExample()
{
Value = 7.5
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
index 8a30fc9ba..4b19c2e66 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
@@ -277,11 +277,11 @@ public async Task ParseParameterWithExamplesShouldSucceed()
Required = true,
Examples =
{
- ["example1"] = new()
+ ["example1"] = new OpenApiExample()
{
Value = 5.0
},
- ["example2"] = new()
+ ["example2"] = new OpenApiExample()
{
Value = (float) 7.5
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs
index b1f6ca474..ef1ebb420 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs
@@ -7,6 +7,7 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Xunit;
using Xunit.Abstractions;
@@ -79,7 +80,7 @@ public class OpenApiMediaTypeTests
public static OpenApiMediaType MediaTypeWithObjectExamples = new()
{
Examples = {
- ["object1"] = new()
+ ["object1"] = new OpenApiExample()
{
Value = new JsonObject
{
@@ -433,7 +434,7 @@ public void MediaTypeCopyConstructorWorks()
var clone = new OpenApiMediaType(MediaTypeWithObjectExamples)
{
Example = 42,
- Examples = new Dictionary(),
+ Examples = new Dictionary(),
Encoding = new Dictionary(),
Extensions = new Dictionary()
};
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
index 1c2e3329f..b76dcf342 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
@@ -50,9 +50,9 @@ public class OpenApiParameterTests
new() { Type = JsonSchemaType.String }
}
},
- Examples = new Dictionary
+ Examples =
{
- ["test"] = new()
+ ["test"] = new OpenApiExample()
{
Summary = "summary3",
Description = "description3"
@@ -135,9 +135,9 @@ public class OpenApiParameterTests
},
UnresolvedReference = true
},
- Examples = new Dictionary
+ Examples =
{
- ["test"] = new()
+ ["test"] = new OpenApiExample()
{
Summary = "summary3",
Description = "description3"
@@ -159,9 +159,9 @@ public class OpenApiParameterTests
{
Type = JsonSchemaType.Object
},
- Examples = new Dictionary
+ Examples =
{
- ["test"] = new()
+ ["test"] = new OpenApiExample()
{
Summary = "summary3",
Description = "description3"
diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
index 887fb3db8..9ad9336d3 100644
--- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
+++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
@@ -159,7 +159,7 @@ namespace Microsoft.OpenApi.Extensions
public static void AddExtension(this T element, string name, Microsoft.OpenApi.Interfaces.IOpenApiExtension any)
where T : Microsoft.OpenApi.Interfaces.IOpenApiExtensible { }
}
- public static class OpenApiReferencableExtensions
+ public static class OpenApiReferenceableExtensions
{
public static Microsoft.OpenApi.Interfaces.IOpenApiReferenceable ResolveReference(this Microsoft.OpenApi.Interfaces.IOpenApiReferenceable element, Microsoft.OpenApi.JsonPointer pointer) { }
}
@@ -211,6 +211,10 @@ namespace Microsoft.OpenApi.Interfaces
{
void Write(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion specVersion);
}
+ public interface IOpenApiReadOnlyExtensible
+ {
+ System.Collections.Generic.IDictionary Extensions { get; }
+ }
public interface IOpenApiReader
{
Microsoft.OpenApi.Reader.ReadResult Read(System.IO.MemoryStream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings);
@@ -218,15 +222,22 @@ namespace Microsoft.OpenApi.Interfaces
T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null)
where T : Microsoft.OpenApi.Interfaces.IOpenApiElement;
}
- public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; }
bool UnresolvedReference { get; set; }
}
- public interface IOpenApiReferenceableWithTarget : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ where out T : Microsoft.OpenApi.Interfaces.IOpenApiReferenceable
{
T Target { get; }
}
+ public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ where out T : Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, V
+ {
+ V CopyReferenceAsTargetElementWithOverrides(V source);
+ }
+ public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { }
public interface IOpenApiSerializable : Microsoft.OpenApi.Interfaces.IOpenApiElement
{
void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer);
@@ -324,6 +335,19 @@ namespace Microsoft.OpenApi.MicrosoftExtensions
public static Microsoft.OpenApi.MicrosoftExtensions.OpenApiReservedParameterExtension Parse(System.Text.Json.Nodes.JsonNode source) { }
}
}
+namespace Microsoft.OpenApi.Models.Interfaces
+{
+ public interface IOpenApiDescribedElement : Microsoft.OpenApi.Interfaces.IOpenApiElement
+ {
+ string Description { get; set; }
+ string Summary { get; set; }
+ }
+ public interface IOpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement
+ {
+ string ExternalValue { get; }
+ System.Text.Json.Nodes.JsonNode Value { get; }
+ }
+}
namespace Microsoft.OpenApi.Models
{
[System.Flags]
@@ -356,7 +380,7 @@ namespace Microsoft.OpenApi.Models
public OpenApiComponents(Microsoft.OpenApi.Models.OpenApiComponents? components) { }
public System.Collections.Generic.IDictionary? Schemas { get; set; }
public virtual System.Collections.Generic.IDictionary? Callbacks { get; set; }
- public virtual System.Collections.Generic.IDictionary? Examples { get; set; }
+ public virtual System.Collections.Generic.IDictionary? Examples { get; set; }
public virtual System.Collections.Generic.IDictionary? Extensions { get; set; }
public virtual System.Collections.Generic.IDictionary? Headers { get; set; }
public virtual System.Collections.Generic.IDictionary? Links { get; set; }
@@ -600,21 +624,18 @@ namespace Microsoft.OpenApi.Models
public string Pointer { get; set; }
public override string ToString() { }
}
- public class OpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample
{
public OpenApiExample() { }
- public OpenApiExample(Microsoft.OpenApi.Models.OpenApiExample example) { }
- public virtual string Description { get; set; }
- public virtual System.Collections.Generic.IDictionary Extensions { get; set; }
- public virtual string ExternalValue { get; set; }
- public virtual Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; }
- public virtual string Summary { get; set; }
- public virtual bool UnresolvedReference { get; set; }
- public virtual System.Text.Json.Nodes.JsonNode Value { get; set; }
- public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
- public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
- public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
- public void SerializeInternal(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion version) { }
+ public OpenApiExample(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { }
+ public string Description { get; set; }
+ public System.Collections.Generic.IDictionary Extensions { get; set; }
+ public string ExternalValue { get; set; }
+ public string Summary { get; set; }
+ public System.Text.Json.Nodes.JsonNode Value { get; set; }
+ public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
+ public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
+ public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
public abstract class OpenApiExtensibleDictionary : System.Collections.Generic.Dictionary, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable
@@ -648,7 +669,7 @@ namespace Microsoft.OpenApi.Models
public virtual bool Deprecated { get; set; }
public virtual string Description { get; set; }
public virtual System.Text.Json.Nodes.JsonNode Example { get; set; }
- public virtual System.Collections.Generic.IDictionary Examples { get; set; }
+ public virtual System.Collections.Generic.IDictionary Examples { get; set; }
public virtual bool Explode { get; set; }
public virtual System.Collections.Generic.IDictionary Extensions { get; set; }
public virtual bool Required { get; set; }
@@ -710,7 +731,7 @@ namespace Microsoft.OpenApi.Models
public OpenApiMediaType(Microsoft.OpenApi.Models.OpenApiMediaType? mediaType) { }
public System.Collections.Generic.IDictionary? Encoding { get; set; }
public System.Text.Json.Nodes.JsonNode? Example { get; set; }
- public System.Collections.Generic.IDictionary? Examples { get; set; }
+ public System.Collections.Generic.IDictionary? Examples { get; set; }
public System.Collections.Generic.IDictionary? Extensions { get; set; }
public virtual Microsoft.OpenApi.Models.OpenApiSchema? Schema { get; set; }
public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
@@ -777,7 +798,7 @@ namespace Microsoft.OpenApi.Models
public virtual bool Deprecated { get; set; }
public virtual string Description { get; set; }
public virtual System.Text.Json.Nodes.JsonNode Example { get; set; }
- public virtual System.Collections.Generic.IDictionary Examples { get; set; }
+ public virtual System.Collections.Generic.IDictionary Examples { get; set; }
public virtual bool Explode { get; set; }
public virtual System.Collections.Generic.IDictionary Extensions { get; set; }
public virtual Microsoft.OpenApi.Models.ParameterLocation? In { get; set; }
@@ -865,7 +886,7 @@ namespace Microsoft.OpenApi.Models
public OpenApiResponses() { }
public OpenApiResponses(Microsoft.OpenApi.Models.OpenApiResponses openApiResponses) { }
}
- public class OpenApiSchema : Microsoft.OpenApi.Interfaces.IOpenApiAnnotatable, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiSchema : Microsoft.OpenApi.Interfaces.IOpenApiAnnotatable, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiSchema() { }
public OpenApiSchema(Microsoft.OpenApi.Models.OpenApiSchema schema) { }
@@ -927,7 +948,6 @@ namespace Microsoft.OpenApi.Models
public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
- public void SerializeInternal(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion version, System.Action callback) { }
}
public class OpenApiSecurityRequirement : System.Collections.Generic.Dictionary>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
@@ -979,7 +999,7 @@ namespace Microsoft.OpenApi.Models
public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiTag() { }
public OpenApiTag(Microsoft.OpenApi.Models.OpenApiTag tag) { }
@@ -1100,7 +1120,7 @@ namespace Microsoft.OpenApi.Models
}
namespace Microsoft.OpenApi.Models.References
{
- public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiCallbackReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiCallback Target { get; }
@@ -1109,19 +1129,24 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiExampleReference : Microsoft.OpenApi.Models.OpenApiExample, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiExampleReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample
{
+ public OpenApiExampleReference(Microsoft.OpenApi.Models.References.OpenApiExampleReference example) { }
public OpenApiExampleReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
+ public string Description { get; set; }
+ public System.Collections.Generic.IDictionary Extensions { get; }
+ public string ExternalValue { get; }
+ public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; }
+ public string Summary { get; set; }
public Microsoft.OpenApi.Models.OpenApiExample Target { get; }
- public override string Description { get; set; }
- public override System.Collections.Generic.IDictionary Extensions { get; set; }
- public override string ExternalValue { get; set; }
- public override string Summary { get; set; }
- public override System.Text.Json.Nodes.JsonNode Value { get; set; }
- public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
- public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
+ public bool UnresolvedReference { get; set; }
+ public System.Text.Json.Nodes.JsonNode Value { get; }
+ public Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample openApiExample) { }
+ public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
+ public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
+ public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiHeaderReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiHeader Target { get; }
@@ -1131,7 +1156,7 @@ namespace Microsoft.OpenApi.Models.References
public override bool Deprecated { get; set; }
public override string Description { get; set; }
public override System.Text.Json.Nodes.JsonNode Example { get; set; }
- public override System.Collections.Generic.IDictionary Examples { get; set; }
+ public override System.Collections.Generic.IDictionary Examples { get; set; }
public override bool Explode { get; set; }
public override System.Collections.Generic.IDictionary Extensions { get; set; }
public override bool Required { get; set; }
@@ -1141,7 +1166,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiLinkReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiLink Target { get; }
@@ -1155,7 +1180,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiParameterReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiParameter Target { get; }
@@ -1165,7 +1190,7 @@ namespace Microsoft.OpenApi.Models.References
public override bool Deprecated { get; set; }
public override string Description { get; set; }
public override System.Text.Json.Nodes.JsonNode Example { get; set; }
- public override System.Collections.Generic.IDictionary Examples { get; set; }
+ public override System.Collections.Generic.IDictionary Examples { get; set; }
public override bool Explode { get; set; }
public override System.Collections.Generic.IDictionary Extensions { get; set; }
public override Microsoft.OpenApi.Models.ParameterLocation? In { get; set; }
@@ -1177,7 +1202,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiPathItemReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiPathItem Target { get; }
@@ -1189,7 +1214,7 @@ namespace Microsoft.OpenApi.Models.References
public override string Summary { get; set; }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiRequestBodyReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiRequestBody Target { get; }
@@ -1200,7 +1225,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiResponseReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiResponse Target { get; }
@@ -1213,7 +1238,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiSchemaReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiSchema? Target { get; }
@@ -1272,7 +1297,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { }
public Microsoft.OpenApi.Models.OpenApiSecurityScheme Target { get; }
@@ -1289,7 +1314,7 @@ namespace Microsoft.OpenApi.Models.References
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
}
- public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
+ public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
{
public OpenApiTagReference(Microsoft.OpenApi.Models.References.OpenApiTagReference source) { }
public OpenApiTagReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument) { }
@@ -1480,13 +1505,13 @@ namespace Microsoft.OpenApi.Services
public virtual void Exit() { }
public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { }
public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { }
- public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceable referenceable) { }
+ public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder referenceHolder) { }
+ public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiCallback callback) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiEncoding encoding) { }
- public virtual void Visit(Microsoft.OpenApi.Models.OpenApiExample example) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs externalDocs) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiHeader header) { }
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiInfo info) { }
@@ -1509,15 +1534,15 @@ namespace Microsoft.OpenApi.Services
public virtual void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { }
public virtual void Visit(Microsoft.OpenApi.Models.References.OpenApiTagReference tag) { }
public virtual void Visit(System.Collections.Generic.IDictionary operations) { }
+ public virtual void Visit(System.Collections.Generic.IDictionary examples) { }
public virtual void Visit(System.Collections.Generic.IDictionary callbacks) { }
public virtual void Visit(System.Collections.Generic.IDictionary encodings) { }
- public virtual void Visit(System.Collections.Generic.IDictionary examples) { }
public virtual void Visit(System.Collections.Generic.IDictionary headers) { }
public virtual void Visit(System.Collections.Generic.IDictionary links) { }
public virtual void Visit(System.Collections.Generic.IDictionary content) { }
public virtual void Visit(System.Collections.Generic.IDictionary webhooks) { }
public virtual void Visit(System.Collections.Generic.IDictionary serverVariables) { }
- public virtual void Visit(System.Collections.Generic.IList example) { }
+ public virtual void Visit(System.Collections.Generic.IList example) { }
public virtual void Visit(System.Collections.Generic.IList parameters) { }
public virtual void Visit(System.Collections.Generic.IList openApiSecurityRequirements) { }
public virtual void Visit(System.Collections.Generic.IList servers) { }
@@ -1580,12 +1605,12 @@ namespace Microsoft.OpenApi.Validations
public void AddWarning(Microsoft.OpenApi.Validations.OpenApiValidatorWarning warning) { }
public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { }
public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { }
+ public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiCallback callback) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiEncoding encoding) { }
- public override void Visit(Microsoft.OpenApi.Models.OpenApiExample example) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs externalDocs) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiHeader header) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiInfo info) { }
@@ -1607,14 +1632,14 @@ namespace Microsoft.OpenApi.Validations
public override void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { }
public override void Visit(System.Collections.Generic.IDictionary operations) { }
+ public override void Visit(System.Collections.Generic.IDictionary examples) { }
public override void Visit(System.Collections.Generic.IDictionary callbacks) { }
public override void Visit(System.Collections.Generic.IDictionary encodings) { }
- public override void Visit(System.Collections.Generic.IDictionary examples) { }
public override void Visit(System.Collections.Generic.IDictionary headers) { }
public override void Visit(System.Collections.Generic.IDictionary links) { }
public override void Visit(System.Collections.Generic.IDictionary content) { }
public override void Visit(System.Collections.Generic.IDictionary serverVariables) { }
- public override void Visit(System.Collections.Generic.IList example) { }
+ public override void Visit(System.Collections.Generic.IList example) { }
}
public class OpenApiValidatorError : Microsoft.OpenApi.Models.OpenApiError
{
diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs
index 3a685f3a8..485f8587c 100644
--- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs
@@ -63,11 +63,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
},
Examples =
{
- ["example0"] = new()
+ ["example0"] = new OpenApiExample()
{
Value = "1",
},
- ["example1"] = new()
+ ["example1"] = new OpenApiExample()
{
Value = new JsonObject()
{
@@ -76,11 +76,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
["z"] = "200"
}
},
- ["example2"] = new()
+ ["example2"] = new OpenApiExample()
{
Value = new JsonArray(){3}
},
- ["example3"] = new()
+ ["example3"] = new OpenApiExample()
{
Value = new JsonObject()
{
diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs
index 834443135..96afcb301 100644
--- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs
@@ -57,11 +57,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
},
Examples =
{
- ["example0"] = new()
+ ["example0"] = new OpenApiExample()
{
Value = "1",
},
- ["example1"] = new()
+ ["example1"] = new OpenApiExample()
{
Value = new JsonObject()
{
@@ -70,11 +70,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
["z"] = "200"
}
},
- ["example2"] = new()
+ ["example2"] = new OpenApiExample()
{
Value = new JsonArray(){3}
},
- ["example3"] = new()
+ ["example3"] = new OpenApiExample()
{
Value = new JsonObject()
{
diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs
index cacf3d7fa..c08c88471 100644
--- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs
@@ -110,11 +110,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
},
Examples =
{
- ["example0"] = new()
+ ["example0"] = new OpenApiExample()
{
Value = "1",
},
- ["example1"] = new()
+ ["example1"] = new OpenApiExample()
{
Value = new JsonObject()
{
@@ -123,11 +123,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
["z"] = "200"
}
},
- ["example2"] = new()
+ ["example2"] = new OpenApiExample()
{
Value = new JsonArray(){3}
},
- ["example3"] = new()
+ ["example3"] = new OpenApiExample()
{
Value = new JsonObject()
{
diff --git a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs
index e805d4673..342fb317a 100644
--- a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs
@@ -3,6 +3,7 @@
using System.Runtime.CompilerServices;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.Interfaces;
using Microsoft.OpenApi.Services;
using Xunit;
@@ -39,7 +40,7 @@ public void ExpectedVirtualsInvolved()
visitor.Visit(default(IDictionary));
visitor.Visit(default(OpenApiMediaType));
visitor.Visit(default(OpenApiEncoding));
- visitor.Visit(default(IDictionary));
+ visitor.Visit(default(IDictionary));
visitor.Visit(default(OpenApiComponents));
visitor.Visit(default(OpenApiExternalDocs));
visitor.Visit(default(OpenApiSchema));
@@ -51,17 +52,17 @@ public void ExpectedVirtualsInvolved()
visitor.Visit(default(OpenApiOAuthFlow));
visitor.Visit(default(OpenApiSecurityRequirement));
visitor.Visit(default(OpenApiSecurityScheme));
- visitor.Visit(default(OpenApiExample));
+ visitor.Visit(default(IOpenApiExample));
visitor.Visit(default(IList));
visitor.Visit(default(IList));
visitor.Visit(default(IOpenApiExtensible));
visitor.Visit(default(IOpenApiExtension));
- visitor.Visit(default(IList));
+ visitor.Visit(default(IList));
visitor.Visit(default(IDictionary));
visitor.Visit(default(IDictionary));
- visitor.Visit(default(IOpenApiReferenceable));
+ visitor.Visit(default(IOpenApiReferenceHolder));
visitor.Exit();
- Assert.True(42 < ((TestVisitor)visitor).CallStack.Count());
+ Assert.True(42 < ((TestVisitor)visitor).CallStack.Count);
}
internal protected class TestVisitor : OpenApiVisitorBase
@@ -213,7 +214,7 @@ public override void Visit(OpenApiEncoding encoding)
base.Visit(encoding);
}
- public override void Visit(IDictionary examples)
+ public override void Visit(IDictionary examples)
{
EncodeCall();
base.Visit(examples);
@@ -285,7 +286,7 @@ public override void Visit(OpenApiSecurityScheme securityScheme)
base.Visit(securityScheme);
}
- public override void Visit(OpenApiExample example)
+ public override void Visit(IOpenApiExample example)
{
EncodeCall();
base.Visit(example);
@@ -315,7 +316,7 @@ public override void Visit(IOpenApiExtension openApiExtension)
base.Visit(openApiExtension);
}
- public override void Visit(IList example)
+ public override void Visit(IList example)
{
EncodeCall();
base.Visit(example);
@@ -333,7 +334,7 @@ public override void Visit(IDictionary encodings)
base.Visit(encodings);
}
- public override void Visit(IOpenApiReferenceable referenceable)
+ public override void Visit(IOpenApiReferenceHolder referenceable)
{
EncodeCall();
base.Visit(referenceable);
diff --git a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs
index f90d058b2..c307229cf 100644
--- a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs
@@ -293,7 +293,7 @@ public override void Visit(OpenApiResponse response)
Locations.Add(this.PathString);
}
- public override void Visit(IOpenApiReferenceable referenceable)
+ public override void Visit(IOpenApiReferenceHolder referenceable)
{
Locations.Add("referenceAt: " + this.PathString);
}
diff --git a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs
index f93b10375..cb554d4f6 100644
--- a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs
@@ -20,7 +20,7 @@ public class OpenApiReferencableTests
private static readonly OpenApiHeader _headerFragment = new()
{
Schema = new OpenApiSchema(),
- Examples = new Dictionary
+ Examples =
{
{ "example1", new OpenApiExample() }
}
@@ -28,7 +28,7 @@ public class OpenApiReferencableTests
private static readonly OpenApiParameter _parameterFragment = new()
{
Schema = new OpenApiSchema(),
- Examples = new Dictionary
+ Examples =
{
{ "example1", new OpenApiExample() }
}