in src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs [56:110]
public OpenApiReference ConvertToOpenApiReference(
string reference,
ReferenceType? type)
{
if (!string.IsNullOrWhiteSpace(reference))
{
var segments = reference.Split('#');
if (segments.Length == 1)
{
// Either this is an external reference as an entire file
// or a simple string-style reference for tag and security scheme.
if (type == null)
{
// "$ref": "Pet.json"
return new OpenApiReference
{
Type = type,
ExternalResource = segments[0]
};
}
if (type == ReferenceType.Tag || type == ReferenceType.SecurityScheme)
{
return new OpenApiReference
{
Type = type,
Id = reference
};
}
}
else if (segments.Length == 2)
{
if (reference.StartsWith("#"))
{
// "$ref": "#/components/schemas/Pet"
return ParseLocalReference(segments[1]);
}
// Where fragments point into a non-OpenAPI document, the id will be the complete fragment identifier
string id = segments[1];
// $ref: externalSource.yaml#/Pet
if (id.StartsWith("/components/"))
{
id = segments[1].Split('/')[3];
}
return new OpenApiReference
{
ExternalResource = segments[0],
Type = type,
Id = id
};
}
}
throw new OpenApiException(string.Format(SRResource.ReferenceHasInvalidFormat, reference));
}