33
44using System ;
55using System . IO ;
6+ using System . Threading . Tasks ;
67using Microsoft . OpenApi . Exceptions ;
78using Microsoft . OpenApi . Extensions ;
89using Microsoft . OpenApi . Interfaces ;
@@ -71,7 +72,67 @@ public OpenApiDocument Read(YamlDocument input, out OpenApiDiagnostic diagnostic
7172 return document ;
7273 }
7374
75+ public async Task < ReadResult > ReadAsync ( YamlDocument input )
76+ {
77+ var diagnostic = new OpenApiDiagnostic ( ) ;
78+ var context = new ParsingContext ( diagnostic )
79+ {
80+ ExtensionParsers = _settings . ExtensionParsers ,
81+ BaseUrl = _settings . BaseUrl
82+ } ;
83+
84+ OpenApiDocument document = null ;
85+ try
86+ {
87+ // Parse the OpenAPI Document
88+ document = context . Parse ( input ) ;
89+
90+ await ResolveReferencesAsync ( diagnostic , document ) ;
91+ }
92+ catch ( OpenApiException ex )
93+ {
94+ diagnostic . Errors . Add ( new OpenApiError ( ex ) ) ;
95+ }
96+
97+ // Validate the document
98+ if ( _settings . RuleSet != null && _settings . RuleSet . Rules . Count > 0 )
99+ {
100+ var errors = document . Validate ( _settings . RuleSet ) ;
101+ foreach ( var item in errors )
102+ {
103+ diagnostic . Errors . Add ( item ) ;
104+ }
105+ }
106+
107+ return new ReadResult ( )
108+ {
109+ OpenApiDocument = document ,
110+ OpenApiDiagnostic = diagnostic
111+ } ;
112+ }
113+
114+
74115 private void ResolveReferences ( OpenApiDiagnostic diagnostic , OpenApiDocument document )
116+ {
117+ // Resolve References if requested
118+ switch ( _settings . ReferenceResolution )
119+ {
120+ case ReferenceResolutionSetting . ResolveAllReferences :
121+ throw new ArgumentException ( "Cannot resolve all references via a synchronous call. Use ReadAsync." ) ;
122+ case ReferenceResolutionSetting . ResolveLocalReferences :
123+ var errors = document . ResolveReferences ( false ) ;
124+
125+ foreach ( var item in errors )
126+ {
127+ diagnostic . Errors . Add ( item ) ;
128+ }
129+ break ;
130+ case ReferenceResolutionSetting . DoNotResolveReferences :
131+ break ;
132+ }
133+ }
134+
135+ private async Task ResolveReferencesAsync ( OpenApiDiagnostic diagnostic , OpenApiDocument document )
75136 {
76137 // Resolve References if requested
77138 switch ( _settings . ReferenceResolution )
@@ -81,8 +142,8 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc
81142 document . Workspace = openApiWorkSpace ;
82143 var streamLoader = new DefaultStreamLoader ( ) ;
83144
84- var workspaceLoader = new OpenApiWorkspaceLoader ( openApiWorkSpace , _settings . CustomExternalLoader ?? streamLoader . Load , _settings ) ;
85- workspaceLoader . Load ( new OpenApiReference ( ) { ExternalResource = "/" } , document ) ;
145+ var workspaceLoader = new OpenApiWorkspaceLoader ( openApiWorkSpace , _settings . CustomExternalLoader ?? streamLoader , _settings ) ;
146+ await workspaceLoader . LoadAsync ( new OpenApiReference ( ) { ExternalResource = "/" } , document ) ;
86147 break ;
87148 case ReferenceResolutionSetting . ResolveLocalReferences :
88149 var errors = document . ResolveReferences ( false ) ;
@@ -97,6 +158,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc
97158 }
98159 }
99160
161+
100162 /// <summary>
101163 /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element.
102164 /// </summary>
0 commit comments