29
29
using System . Reflection ;
30
30
using Microsoft . Extensions . Configuration ;
31
31
using System . Runtime . CompilerServices ;
32
+ using System . Reflection . Metadata ;
32
33
33
34
namespace Microsoft . OpenApi . Hidi
34
35
{
@@ -110,43 +111,13 @@ CancellationToken cancellationToken
110
111
else
111
112
{
112
113
stream = await GetStream ( openapi , logger , cancellationToken ) ;
113
-
114
- using ( logger . BeginScope ( $ "Parse OpenAPI: { openapi } ", openapi ) )
115
- {
116
- stopwatch . Restart ( ) ;
117
- var result = await new OpenApiStreamReader ( new OpenApiReaderSettings
118
- {
119
- RuleSet = ValidationRuleSet . GetDefaultRuleSet ( ) ,
120
- LoadExternalRefs = inlineExternal ,
121
- BaseUrl = openapi . StartsWith ( "http" ) ? new Uri ( openapi ) : new Uri ( "file:" + new FileInfo ( openapi ) . DirectoryName + "\\ " )
122
- }
123
- ) . ReadAsync ( stream ) ;
124
-
125
- document = result . OpenApiDocument ;
126
-
127
- var context = result . OpenApiDiagnostic ;
128
- if ( context . Errors . Count > 0 )
129
- {
130
- logger . LogTrace ( "{timestamp}ms: Parsed OpenAPI with errors. {count} paths found." , stopwatch . ElapsedMilliseconds , document . Paths . Count ) ;
131
-
132
- var errorReport = new StringBuilder ( ) ;
133
-
134
- foreach ( var error in context . Errors )
135
- {
136
- logger . LogError ( "OpenApi Parsing error: {message}" , error . ToString ( ) ) ;
137
- errorReport . AppendLine ( error . ToString ( ) ) ;
138
- }
139
- logger . LogError ( $ "{ stopwatch . ElapsedMilliseconds } ms: OpenApi Parsing errors { string . Join ( Environment . NewLine , context . Errors . Select ( e => e . Message ) . ToArray ( ) ) } ") ;
140
- }
141
- else
142
- {
143
- logger . LogTrace ( "{timestamp}ms: Parsed OpenApi successfully. {count} paths found." , stopwatch . ElapsedMilliseconds , document . Paths . Count ) ;
144
- }
145
-
146
- openApiFormat = format ?? GetOpenApiFormat ( openapi , logger ) ;
147
- openApiVersion = version != null ? TryParseOpenApiSpecVersion ( version ) : result . OpenApiDiagnostic . SpecificationVersion ;
148
- stopwatch . Stop ( ) ;
149
- }
114
+ stopwatch . Restart ( ) ;
115
+ var result = await ParseOpenApi ( openapi , logger , stream ) ;
116
+ document = result . OpenApiDocument ;
117
+
118
+ openApiFormat = format ?? GetOpenApiFormat ( openapi , logger ) ;
119
+ openApiVersion = version != null ? TryParseOpenApiSpecVersion ( version ) : result . OpenApiDiagnostic . SpecificationVersion ;
120
+ stopwatch . Stop ( ) ;
150
121
}
151
122
152
123
using ( logger . BeginScope ( "Filter" ) )
@@ -267,40 +238,13 @@ public static async Task ValidateOpenApiDocument(
267
238
}
268
239
using var stream = await GetStream ( openapi , logger , cancellationToken ) ;
269
240
270
- OpenApiDocument document ;
271
- Stopwatch stopwatch = Stopwatch . StartNew ( ) ;
272
- using ( logger . BeginScope ( $ "Parsing OpenAPI: { openapi } ", openapi ) )
273
- {
274
- stopwatch . Start ( ) ;
275
-
276
- var result = await new OpenApiStreamReader ( new OpenApiReaderSettings
277
- {
278
- RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
279
- }
280
- ) . ReadAsync ( stream ) ;
281
-
282
- logger . LogTrace ( "{timestamp}ms: Completed parsing." , stopwatch . ElapsedMilliseconds ) ;
283
-
284
- document = result . OpenApiDocument ;
285
- var context = result . OpenApiDiagnostic ;
286
- if ( context . Errors . Count != 0 )
287
- {
288
- using ( logger . BeginScope ( "Detected errors" ) )
289
- {
290
- foreach ( var error in context . Errors )
291
- {
292
- logger . LogError ( error . ToString ( ) ) ;
293
- }
294
- }
295
- }
296
- stopwatch . Stop ( ) ;
297
- }
241
+ var result = await ParseOpenApi ( openapi , logger , stream ) ;
298
242
299
243
using ( logger . BeginScope ( "Calculating statistics" ) )
300
244
{
301
245
var statsVisitor = new StatsVisitor ( ) ;
302
246
var walker = new OpenApiWalker ( statsVisitor ) ;
303
- walker . Walk ( document ) ;
247
+ walker . Walk ( result . OpenApiDocument ) ;
304
248
305
249
logger . LogTrace ( "Finished walking through the OpenApi document. Generating a statistics report.." ) ;
306
250
logger . LogInformation ( statsVisitor . GetStatisticsReport ( ) ) ;
@@ -312,6 +256,29 @@ public static async Task ValidateOpenApiDocument(
312
256
}
313
257
}
314
258
259
+ private static async Task < ReadResult > ParseOpenApi ( string openApiFile , ILogger < OpenApiService > logger , Stream stream )
260
+ {
261
+ ReadResult result ;
262
+ Stopwatch stopwatch = Stopwatch . StartNew ( ) ;
263
+ using ( logger . BeginScope ( $ "Parsing OpenAPI: { openApiFile } ", openApiFile ) )
264
+ {
265
+ stopwatch . Start ( ) ;
266
+
267
+ result = await new OpenApiStreamReader ( new OpenApiReaderSettings
268
+ {
269
+ RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
270
+ }
271
+ ) . ReadAsync ( stream ) ;
272
+
273
+ logger . LogTrace ( "{timestamp}ms: Completed parsing." , stopwatch . ElapsedMilliseconds ) ;
274
+
275
+ LogErrors ( logger , result ) ;
276
+ stopwatch . Stop ( ) ;
277
+ }
278
+
279
+ return result ;
280
+ }
281
+
315
282
internal static IConfiguration GetConfiguration ( string settingsFile )
316
283
{
317
284
settingsFile ??= "appsettings.json" ;
@@ -548,42 +515,15 @@ internal static async Task ShowOpenApiDocument(string openapi, FileInfo output,
548
515
}
549
516
using var stream = await GetStream ( openapi , logger , cancellationToken ) ;
550
517
551
- OpenApiDocument document ;
552
- Stopwatch stopwatch = Stopwatch . StartNew ( ) ;
553
- using ( logger . BeginScope ( $ "Parsing OpenAPI: { openapi } ", openapi ) )
554
- {
555
- stopwatch . Start ( ) ;
556
-
557
- var result = await new OpenApiStreamReader ( new OpenApiReaderSettings
558
- {
559
- RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
560
- }
561
- ) . ReadAsync ( stream ) ;
562
-
563
- logger . LogTrace ( "{timestamp}ms: Completed parsing." , stopwatch . ElapsedMilliseconds ) ;
564
-
565
- document = result . OpenApiDocument ;
566
- var context = result . OpenApiDiagnostic ;
567
- if ( context . Errors . Count != 0 )
568
- {
569
- using ( logger . BeginScope ( "Detected errors" ) )
570
- {
571
- foreach ( var error in context . Errors )
572
- {
573
- logger . LogError ( error . ToString ( ) ) ;
574
- }
575
- }
576
- }
577
- stopwatch . Stop ( ) ;
578
- }
518
+ var result = await ParseOpenApi ( openapi , logger , stream ) ;
579
519
580
520
using ( logger . BeginScope ( "Creating diagram" ) )
581
521
{
582
522
// Create OpenApiUrlTree from document
583
523
584
524
using var file = new FileStream ( output . FullName , FileMode . Create ) ;
585
525
using var writer = new StreamWriter ( file ) ;
586
- WriteTreeDocument ( openapi , document , writer ) ;
526
+ WriteTreeDocument ( openapi , result . OpenApiDocument , writer ) ;
587
527
588
528
logger . LogTrace ( "Finished walking through the OpenApi document. " ) ;
589
529
}
@@ -594,6 +534,21 @@ internal static async Task ShowOpenApiDocument(string openapi, FileInfo output,
594
534
}
595
535
}
596
536
537
+ private static void LogErrors ( ILogger < OpenApiService > logger , ReadResult result )
538
+ {
539
+ var context = result . OpenApiDiagnostic ;
540
+ if ( context . Errors . Count != 0 )
541
+ {
542
+ using ( logger . BeginScope ( "Detected errors" ) )
543
+ {
544
+ foreach ( var error in context . Errors )
545
+ {
546
+ logger . LogError ( error . ToString ( ) ) ;
547
+ }
548
+ }
549
+ }
550
+ }
551
+
597
552
private static void WriteTreeDocument ( string openapi , OpenApiDocument document , StreamWriter writer )
598
553
{
599
554
var rootNode = OpenApiUrlTreeNode . Create ( document , "main" ) ;
0 commit comments