Ejemplo n.º 1
0
        /// <summary>
        /// Walk the OpenApiDocument and resolve unresolved references
        /// </summary>
        /// <param name="useExternal">Indicates if external references should be resolved.  Document needs to reference a workspace for this to be possible.</param>
        public IEnumerable <OpenApiError> ResolveReferences(bool useExternal = false)
        {
            var resolver = new OpenApiReferenceResolver(this, useExternal);
            var walker   = new OpenApiWalker(resolver);

            walker.Walk(this);
            return(resolver.Errors);
        }
        /// <summary>
        /// Reads the stream input and parses it into an Open API document.
        /// </summary>
        /// <param name="input">TextReader containing OpenAPI description to parse.</param>
        /// <param name="diagnostic">Returns diagnostic object containing errors detected during parsing</param>
        /// <returns>Instance of newly created OpenApiDocument</returns>
        public OpenApiDocument Read(YamlDocument input, out OpenApiDiagnostic diagnostic)
        {
            diagnostic = new OpenApiDiagnostic();
            var context = new ParsingContext(diagnostic)
            {
                ExtensionParsers = _settings.ExtensionParsers,
                BaseUrl          = _settings.BaseUrl
            };

            OpenApiDocument document = null;

            try
            {
                // Parse the OpenAPI Document
                document = context.Parse(input);

                // Resolve References if requested
                switch (_settings.ReferenceResolution)
                {
                case ReferenceResolutionSetting.ResolveAllReferences:
                    throw new ArgumentException(Properties.SRResource.CannotResolveRemoteReferencesSynchronously);

                case ReferenceResolutionSetting.ResolveLocalReferences:
                    var resolver = new OpenApiReferenceResolver(document);
                    var walker   = new OpenApiWalker(resolver);
                    walker.Walk(document);
                    foreach (var item in resolver.Errors)
                    {
                        diagnostic.Errors.Add(item);
                    }
                    break;

                case ReferenceResolutionSetting.DoNotResolveReferences:
                    break;
                }
            }
            catch (OpenApiException ex)
            {
                diagnostic.Errors.Add(new OpenApiError(ex));
            }

            // Validate the document
            if (_settings.RuleSet != null && _settings.RuleSet.Rules.Count > 0)
            {
                var errors = document.Validate(_settings.RuleSet);
                foreach (var item in errors)
                {
                    diagnostic.Errors.Add(item);
                }
            }

            return(document);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Reads the stream input and parses it into an Open API document.
        /// </summary>
        /// <param name="input">Stream containing OpenAPI description to parse.</param>
        /// <param name="diagnostic">Returns diagnostic object containing errors detected during parsing</param>
        /// <returns>Instance of newly created OpenApiDocument</returns>
        public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
        {
            ParsingContext context;
            YamlDocument   yamlDocument;

            diagnostic = new OpenApiDiagnostic();

            // Parse the YAML/JSON
            try
            {
                yamlDocument = LoadYamlDocument(input);
            }
            catch (SyntaxErrorException ex)
            {
                diagnostic.Errors.Add(new OpenApiError(string.Empty, ex.Message));
                return(new OpenApiDocument());
            }

            context = new ParsingContext
            {
                ExtensionParsers = _settings.ExtensionParsers
            };

            // Parse the OpenAPI Document
            var document = context.Parse(yamlDocument, diagnostic);

            // Resolve References if requested
            switch (_settings.ReferenceResolution)
            {
            case ReferenceResolutionSetting.ResolveAllReferences:
                throw new ArgumentException(Properties.SRResource.CannotResolveRemoteReferencesSynchronously);

            case ReferenceResolutionSetting.ResolveLocalReferences:
                var resolver = new OpenApiReferenceResolver(document);
                var walker   = new OpenApiWalker(resolver);
                walker.Walk(document);
                break;

            case ReferenceResolutionSetting.DoNotResolveReferences:
                break;
            }

            // Validate the document
            var errors = document.Validate(_settings.RuleSet);

            foreach (var item in errors)
            {
                diagnostic.Errors.Add(new OpenApiError(item.ErrorPath, item.ErrorMessage));
            }

            return(document);
        }
Ejemplo n.º 4
0
        public async Task <JToken> LoadSchemaAsync(IEnumerable <string> documentUris, string?authorization)
        {
            var docs = documentUris.ToArray();

            if (docs.Length != 1)
            {
                throw new ArgumentException($"Cannot load multiple OpenApiSchema using this loader [{nameof(OpenApiSchemaLoader)}]", nameof(documentUris));
            }
            var documentUri = docs[0];

            var settings = new OpenApiReaderSettings()
            {
                //ReferenceResolution = ReferenceResolutionSetting.ResolveAllReferences,
            };

            using (var stream = await httpClient.GetStreamAsync(documentUri))
            {
                var openApiDocument = new OpenApiStreamReader(settings).Read(stream, out var diagnostic);

                var resolver = new OpenApiReferenceResolver(openApiDocument);
                var walker   = new OpenApiWalker(resolver);
                walker.Walk(openApiDocument);
                foreach (var item in resolver.Errors)
                {
                    diagnostic.Errors.Add(item);
                }

                if (diagnostic.Errors.Count != 0)
                {
                    var message = string.Join(Environment.NewLine, diagnostic.Errors);
                    throw new InvalidOperationException(message);
                }

                var apiV3Json = openApiDocument.Serialize(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json);
                return(JToken.Parse(apiV3Json));
            }
        }