Skip to content

Commit 3f59784

Browse files
committed
Refactored OpenAPIService to remove duplicate code
1 parent 079da0f commit 3f59784

File tree

1 file changed

+50
-95
lines changed

1 file changed

+50
-95
lines changed

src/Microsoft.OpenApi.Hidi/OpenApiService.cs

Lines changed: 50 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
using System.Reflection;
3030
using Microsoft.Extensions.Configuration;
3131
using System.Runtime.CompilerServices;
32+
using System.Reflection.Metadata;
3233

3334
namespace Microsoft.OpenApi.Hidi
3435
{
@@ -110,43 +111,13 @@ CancellationToken cancellationToken
110111
else
111112
{
112113
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();
150121
}
151122

152123
using (logger.BeginScope("Filter"))
@@ -267,40 +238,13 @@ public static async Task ValidateOpenApiDocument(
267238
}
268239
using var stream = await GetStream(openapi, logger, cancellationToken);
269240

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);
298242

299243
using (logger.BeginScope("Calculating statistics"))
300244
{
301245
var statsVisitor = new StatsVisitor();
302246
var walker = new OpenApiWalker(statsVisitor);
303-
walker.Walk(document);
247+
walker.Walk(result.OpenApiDocument);
304248

305249
logger.LogTrace("Finished walking through the OpenApi document. Generating a statistics report..");
306250
logger.LogInformation(statsVisitor.GetStatisticsReport());
@@ -312,6 +256,29 @@ public static async Task ValidateOpenApiDocument(
312256
}
313257
}
314258

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+
315282
internal static IConfiguration GetConfiguration(string settingsFile)
316283
{
317284
settingsFile ??= "appsettings.json";
@@ -548,42 +515,15 @@ internal static async Task ShowOpenApiDocument(string openapi, FileInfo output,
548515
}
549516
using var stream = await GetStream(openapi, logger, cancellationToken);
550517

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);
579519

580520
using (logger.BeginScope("Creating diagram"))
581521
{
582522
// Create OpenApiUrlTree from document
583523

584524
using var file = new FileStream(output.FullName, FileMode.Create);
585525
using var writer = new StreamWriter(file);
586-
WriteTreeDocument(openapi, document, writer);
526+
WriteTreeDocument(openapi, result.OpenApiDocument, writer);
587527

588528
logger.LogTrace("Finished walking through the OpenApi document. ");
589529
}
@@ -594,6 +534,21 @@ internal static async Task ShowOpenApiDocument(string openapi, FileInfo output,
594534
}
595535
}
596536

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+
597552
private static void WriteTreeDocument(string openapi, OpenApiDocument document, StreamWriter writer)
598553
{
599554
var rootNode = OpenApiUrlTreeNode.Create(document, "main");

0 commit comments

Comments
 (0)