in src/Microsoft.OpenApi/Models/OpenApiDocument.cs [344:425]
public IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool useExternal)
{
if (reference == null)
{
return null;
}
// Todo: Verify if we need to check to see if this external reference is actually targeted at this document.
if (useExternal)
{
if (this.Workspace == null)
{
throw new ArgumentException(Properties.SRResource.WorkspaceRequredForExternalReferenceResolution);
}
return this.Workspace.ResolveReference(reference);
}
if (!reference.Type.HasValue)
{
throw new ArgumentException(Properties.SRResource.LocalReferenceRequiresType);
}
// Special case for Tag
if (reference.Type == ReferenceType.Tag)
{
foreach (var tag in this.Tags)
{
if (tag.Name == reference.Id)
{
tag.Reference = reference;
return tag;
}
}
return null;
}
if (this.Components == null)
{
throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceId, reference.Id));
}
try
{
switch (reference.Type)
{
case ReferenceType.Schema:
return this.Components.Schemas[reference.Id];
case ReferenceType.Response:
return this.Components.Responses[reference.Id];
case ReferenceType.Parameter:
return this.Components.Parameters[reference.Id];
case ReferenceType.Example:
return this.Components.Examples[reference.Id];
case ReferenceType.RequestBody:
return this.Components.RequestBodies[reference.Id];
case ReferenceType.Header:
return this.Components.Headers[reference.Id];
case ReferenceType.SecurityScheme:
return this.Components.SecuritySchemes[reference.Id];
case ReferenceType.Link:
return this.Components.Links[reference.Id];
case ReferenceType.Callback:
return this.Components.Callbacks[reference.Id];
default:
throw new OpenApiException(Properties.SRResource.InvalidReferenceType);
}
}
catch (KeyNotFoundException)
{
throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceId, reference.Id));
}
}