示例#1
0
        /// <summary>
        /// Load the referenced <see cref="IOpenApiReferenceable"/> object from a <see cref="OpenApiReference"/> object
        /// </summary>
        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));
            }
        }
        /// <summary>
        /// Load the referenced <see cref="IOpenApiReferenceable"/> object from a <see cref="OpenApiReference"/> object
        /// </summary>
        public IOpenApiReferenceable ResolveReference(OpenApiReference reference)
        {
            if (reference == null)
            {
                return(null);
            }

            if (reference.IsExternal)
            {
                // Should not attempt to resolve external references against a single document.
                throw new ArgumentException(Properties.SRResource.RemoteReferenceNotSupported);
            }

            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));
            }
        }
示例#3
0
 /// <summary>
 /// Load the referenced <see cref="IOpenApiReferenceable"/> object from a <see cref="OpenApiReference"/> object
 /// </summary>
 public IOpenApiReferenceable ResolveReference(OpenApiReference reference)
 {
     return(ResolveReference(reference, false));
 }