Skip to content
8 changes: 4 additions & 4 deletions src/Microsoft.OpenApi.Readers/ParsingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ internal OpenApiDocument Parse(YamlDocument yamlDocument)
switch (inputVersion)
{
case string version when version == "2.0":
VersionService = new OpenApiV2VersionService();
VersionService = new OpenApiV2VersionService(Diagnostic);
doc = VersionService.LoadDocument(RootNode);
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi2_0;
break;

case string version when version.StartsWith("3.0"):
VersionService = new OpenApiV3VersionService();
VersionService = new OpenApiV3VersionService(Diagnostic);
doc = VersionService.LoadDocument(RootNode);
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi3_0;
break;
Expand All @@ -93,12 +93,12 @@ internal T ParseFragment<T>(YamlDocument yamlDocument, OpenApiSpecVersion versio
switch (version)
{
case OpenApiSpecVersion.OpenApi2_0:
VersionService = new OpenApiV2VersionService();
VersionService = new OpenApiV2VersionService(Diagnostic);
element = this.VersionService.LoadElement<T>(node);
break;

case OpenApiSpecVersion.OpenApi3_0:
this.VersionService = new OpenApiV3VersionService();
this.VersionService = new OpenApiV3VersionService(Diagnostic);
element = this.VersionService.LoadElement<T>(node);
break;
}
Expand Down
21 changes: 20 additions & 1 deletion src/Microsoft.OpenApi.Readers/V2/OpenApiV2VersionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,17 @@ namespace Microsoft.OpenApi.Readers.V2
/// </summary>
internal class OpenApiV2VersionService : IOpenApiVersionService
{
public OpenApiDiagnostic Diagnostic { get; }

/// <summary>
/// Create Parsing Context
/// </summary>
/// <param name="diagnostic">Provide instance for diagnotic object for collecting and accessing information about the parsing.</param>
public OpenApiV2VersionService(OpenApiDiagnostic diagnostic)
{
Diagnostic = diagnostic;
}

private IDictionary<Type, Func<ParseNode, object>> _loaders = new Dictionary<Type, Func<ParseNode, object>>
{
[typeof(IOpenApiAny)] = OpenApiV2Deserializer.LoadAny,
Expand Down Expand Up @@ -154,7 +165,15 @@ public OpenApiReference ConvertToOpenApiReference(string reference, ReferenceTyp
if (reference.StartsWith("#"))
{
// "$ref": "#/definitions/Pet"
return ParseLocalReference(segments[1]);
try
{
return ParseLocalReference(segments[1]);
}
catch (OpenApiException ex)
{
Diagnostic.Errors.Add(new OpenApiError(ex));
return null;
}
}

// $ref: externalSource.yaml#/Pet
Expand Down
23 changes: 21 additions & 2 deletions src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

using System;
Expand All @@ -19,6 +19,17 @@ namespace Microsoft.OpenApi.Readers.V3
/// </summary>
internal class OpenApiV3VersionService : IOpenApiVersionService
{
public OpenApiDiagnostic Diagnostic { get; }

/// <summary>
/// Create Parsing Context
/// </summary>
/// <param name="diagnostic">Provide instance for diagnotic object for collecting and accessing information about the parsing.</param>
public OpenApiV3VersionService(OpenApiDiagnostic diagnostic)
{
Diagnostic = diagnostic;
}

private IDictionary<Type, Func<ParseNode, object>> _loaders = new Dictionary<Type, Func<ParseNode, object>>
{
[typeof(IOpenApiAny)] = OpenApiV3Deserializer.LoadAny,
Expand Down Expand Up @@ -88,7 +99,15 @@ public OpenApiReference ConvertToOpenApiReference(
if (reference.StartsWith("#"))
{
// "$ref": "#/components/schemas/Pet"
return ParseLocalReference(segments[1]);
try
{
return ParseLocalReference(segments[1]);
}
catch (OpenApiException ex)
{
Diagnostic.Errors.Add(new OpenApiError(ex));
return null;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to add an error to the errors collection in the diagnostics object.

}
}
// Where fragments point into a non-OpenAPI document, the id will be the complete fragment identifier
string id = segments[1];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,18 @@ namespace Microsoft.OpenApi.Readers.Tests
{
public class ConvertToOpenApiReferenceV2Tests
{
public OpenApiDiagnostic Diagnostic{get;}

public ConvertToOpenApiReferenceV2Tests()
{
Diagnostic = new OpenApiDiagnostic();
}

[Fact]
public void ParseExternalReference()
{
// Arrange
var versionService = new OpenApiV2VersionService();
var versionService = new OpenApiV2VersionService(Diagnostic);
var externalResource = "externalSchema.json";
var id = "externalPathSegment1/externalPathSegment2/externalPathSegment3";
var input = $"{externalResource}#/{id}";
Expand All @@ -33,7 +39,7 @@ public void ParseExternalReference()
public void ParseLocalParameterReference()
{
// Arrange
var versionService = new OpenApiV2VersionService();
var versionService = new OpenApiV2VersionService(Diagnostic);
var referenceType = ReferenceType.Parameter;
var id = "parameterId";
var input = $"#/parameters/{id}";
Expand All @@ -51,7 +57,7 @@ public void ParseLocalParameterReference()
public void ParseLocalSchemaReference()
{
// Arrange
var versionService = new OpenApiV2VersionService();
var versionService = new OpenApiV2VersionService(Diagnostic);
var referenceType = ReferenceType.Schema;
var id = "parameterId";
var input = $"#/definitions/{id}";
Expand All @@ -69,7 +75,7 @@ public void ParseLocalSchemaReference()
public void ParseTagReference()
{
// Arrange
var versionService = new OpenApiV2VersionService();
var versionService = new OpenApiV2VersionService(Diagnostic);
var referenceType = ReferenceType.Tag;
var id = "tagId";
var input = $"{id}";
Expand All @@ -87,7 +93,7 @@ public void ParseTagReference()
public void ParseSecuritySchemeReference()
{
// Arrange
var versionService = new OpenApiV2VersionService();
var versionService = new OpenApiV2VersionService(Diagnostic);
var referenceType = ReferenceType.SecurityScheme;
var id = "securitySchemeId";
var input = $"{id}";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,20 @@ namespace Microsoft.OpenApi.Readers.Tests
{
public class ConvertToOpenApiReferenceV3Tests
{
public OpenApiDiagnostic Diagnostic { get; }

public ConvertToOpenApiReferenceV3Tests()
{
Diagnostic = new OpenApiDiagnostic();
}



[Fact]
public void ParseExternalReference()
{
// Arrange
var versionService = new OpenApiV3VersionService();
var versionService = new OpenApiV3VersionService(Diagnostic);
var externalResource = "externalSchema.json";
var id = "/externalPathSegment1/externalPathSegment2/externalPathSegment3";
var input = $"{externalResource}#{id}";
Expand All @@ -33,7 +41,7 @@ public void ParseExternalReference()
public void ParseLocalParameterReference()
{
// Arrange
var versionService = new OpenApiV3VersionService();
var versionService = new OpenApiV3VersionService(Diagnostic);
var referenceType = ReferenceType.Parameter;
var id = "parameterId";
var input = $"#/components/parameters/{id}";
Expand All @@ -51,7 +59,7 @@ public void ParseLocalParameterReference()
public void ParseLocalSchemaReference()
{
// Arrange
var versionService = new OpenApiV3VersionService();
var versionService = new OpenApiV3VersionService(Diagnostic);
var referenceType = ReferenceType.Schema;
var id = "schemaId";
var input = $"#/components/schemas/{id}";
Expand All @@ -69,7 +77,7 @@ public void ParseLocalSchemaReference()
public void ParseTagReference()
{
// Arrange
var versionService = new OpenApiV3VersionService();
var versionService = new OpenApiV3VersionService(Diagnostic);
var referenceType = ReferenceType.Tag;
var id = "tagId";
var input = $"{id}";
Expand All @@ -87,7 +95,7 @@ public void ParseTagReference()
public void ParseSecuritySchemeReference()
{
// Arrange
var versionService = new OpenApiV3VersionService();
var versionService = new OpenApiV3VersionService(Diagnostic);
var referenceType = ReferenceType.SecurityScheme;
var id = "securitySchemeId";
var input = $"{id}";
Expand Down