diff --git a/src/Microsoft.OpenApi.Hidi/Handlers/TransformCommandHandler.cs b/src/Microsoft.OpenApi.Hidi/Handlers/TransformCommandHandler.cs index 696837d3f..e46b34340 100644 --- a/src/Microsoft.OpenApi.Hidi/Handlers/TransformCommandHandler.cs +++ b/src/Microsoft.OpenApi.Hidi/Handlers/TransformCommandHandler.cs @@ -50,6 +50,7 @@ public async Task InvokeAsync(InvocationContext context) string filterbyoperationids = context.ParseResult.GetValueForOption(FilterByOperationIdsOption); string filterbytags = context.ParseResult.GetValueForOption(FilterByTagsOption); string filterbycollection = context.ParseResult.GetValueForOption(FilterByCollectionOption); + CancellationToken cancellationToken = (CancellationToken)context.BindingContext.GetService(typeof(CancellationToken)); using var loggerFactory = Logger.ConfigureLogger(logLevel); diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 56dda4d9a..60bba4aef 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -102,7 +102,7 @@ CancellationToken cancellationToken stream.Position = 0; } - document = await ConvertCsdlToOpenApi(stream, settingsFile); + document = await ConvertCsdlToOpenApi(stream, settingsFile, cancellationToken); stopwatch.Stop(); logger.LogTrace("{timestamp}ms: Generated OpenAPI with {paths} paths.", stopwatch.ElapsedMilliseconds, document.Paths.Count); } @@ -216,6 +216,10 @@ CancellationToken cancellationToken textWriter.Flush(); } } + catch(TaskCanceledException) + { + Console.Error.WriteLine("CTRL+C pressed, aborting the operation."); + } catch (Exception ex) { throw new InvalidOperationException($"Could not transform the document, reason: {ex.Message}", ex); @@ -324,12 +328,12 @@ internal static IConfiguration GetConfiguration(string settingsFile) /// /// The CSDL stream. /// An OpenAPI document. - public static async Task ConvertCsdlToOpenApi(Stream csdl, string settingsFile = null) + public static async Task ConvertCsdlToOpenApi(Stream csdl, string settingsFile = null, CancellationToken token = default) { using var reader = new StreamReader(csdl); - var csdlText = await reader.ReadToEndAsync(); + var csdlText = await reader.ReadToEndAsync(token); var edmModel = CsdlReader.Parse(XElement.Parse(csdlText).CreateReader()); - + var config = GetConfiguration(settingsFile); var settings = new OpenApiConvertSettings() { @@ -353,9 +357,8 @@ public static async Task ConvertCsdlToOpenApi(Stream csdl, stri EnableTypeDisambiguationForDefaultValueOfOdataTypeProperty = true }; config.GetSection("OpenApiConvertSettings").Bind(settings); - - OpenApiDocument document = edmModel.ConvertToOpenApi(settings); + OpenApiDocument document = edmModel.ConvertToOpenApi(settings); document = FixReferences(document); return document; diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index 71e9e0d00..e9246eb6c 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -1,15 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.CommandLine; -using System.CommandLine.Builder; -using System.CommandLine.Hosting; using System.CommandLine.Parsing; - +using System.Diagnostics; using System.IO; +using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Hidi.Handlers; @@ -18,9 +16,8 @@ namespace Microsoft.OpenApi.Hidi static class Program { static async Task Main(string[] args) - { - var rootCommand = new RootCommand() { - }; + { + var rootCommand = new RootCommand() {}; // command option parameters and aliases var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL"); @@ -120,12 +117,12 @@ static async Task Main(string[] args) rootCommand.Add(transformCommand); rootCommand.Add(validateCommand); - + // Parse the incoming args and invoke the handler await rootCommand.InvokeAsync(args); //// Wait for logger to write messages to the console before exiting await Task.Delay(10); - } + } } } diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs index c2fb3798f..3d764b4fb 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs @@ -39,7 +39,7 @@ public async Task ReturnFilteredOpenApiDocBasedOnOperationIdsAndInputCsdlDocumen var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UtilityFiles\\Todo.xml"); var fileInput = new FileInfo(filePath); var csdlStream = fileInput.OpenRead(); - + // Act var openApiDoc = await OpenApiService.ConvertCsdlToOpenApi(csdlStream); var predicate = OpenApiFilterService.CreatePredicate(operationIds, tags);