Skip to content

Commit 4eb1c6c

Browse files
Add resolving references to child properties of a Header fragment
1 parent 7db3ea7 commit 4eb1c6c

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public static IOpenApiReferenceable ResolveReference(this IOpenApiReferenceable
3030
return element;
3131
try
3232
{
33+
if (element.GetType() == typeof(OpenApiHeader))
34+
{
35+
return ResolveReferenceOnHeaderElement((OpenApiHeader)element, jsonPointer);
36+
}
3337
if (element.GetType() == typeof(OpenApiParameter))
3438
{
3539
return ResolveReferenceOnParameterElement((OpenApiParameter)element, jsonPointer);
@@ -42,6 +46,24 @@ public static IOpenApiReferenceable ResolveReference(this IOpenApiReferenceable
4246
throw new NotImplementedException();
4347
}
4448

49+
private static IOpenApiReferenceable ResolveReferenceOnHeaderElement(OpenApiHeader headerElement, string jsonPointer)
50+
{
51+
var jsonPointerTokens = jsonPointer.Split('/');
52+
var propertyName = jsonPointerTokens.ElementAtOrDefault(1);
53+
switch (propertyName)
54+
{
55+
case OpenApiConstants.Schema:
56+
return headerElement.Schema;
57+
case OpenApiConstants.Examples:
58+
{
59+
var mapKey = jsonPointerTokens.ElementAtOrDefault(2);
60+
return headerElement.Examples[mapKey];
61+
}
62+
default:
63+
throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, jsonPointer));
64+
}
65+
}
66+
4567
private static IOpenApiReferenceable ResolveReferenceOnParameterElement(OpenApiParameter parameterElement, string jsonPointer)
4668
{
4769
var jsonPointerTokens = jsonPointer.Split('/');

test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ public class OpenApiReferencableTests
1818
private static readonly OpenApiCallback _callbackFragment = new OpenApiCallback();
1919
private static readonly OpenApiExample _exampleFragment = new OpenApiExample();
2020
private static readonly OpenApiLink _linkFragment = new OpenApiLink();
21-
private static readonly OpenApiHeader _headerFragment = new OpenApiHeader();
21+
private static readonly OpenApiHeader _headerFragment = new OpenApiHeader()
22+
{
23+
Schema = new OpenApiSchema(),
24+
Examples = new Dictionary<string, OpenApiExample>
25+
{
26+
{ "example1", new OpenApiExample() }
27+
}
28+
};
2229
private static readonly OpenApiParameter _parameterFragment = new OpenApiParameter
2330
{
2431
Schema = new OpenApiSchema(),
@@ -40,6 +47,8 @@ public class OpenApiReferencableTests
4047
new object[] { _exampleFragment, "/", _exampleFragment },
4148
new object[] { _linkFragment, "/", _linkFragment },
4249
new object[] { _headerFragment, "/", _headerFragment },
50+
new object[] { _headerFragment, "/schema", _headerFragment.Schema },
51+
new object[] { _headerFragment, "/examples/example1", _headerFragment.Examples["example1"] },
4352
new object[] { _parameterFragment, "/", _parameterFragment },
4453
new object[] { _parameterFragment, "/schema", _parameterFragment.Schema },
4554
new object[] { _parameterFragment, "/examples/example1", _parameterFragment.Examples["example1"] },

0 commit comments

Comments
 (0)