/// <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); }
/// <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); }
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)); } }