Skip to content

Commit f4dee06

Browse files
committed
Use strongly typed config and options
1 parent 9985902 commit f4dee06

File tree

11 files changed

+335
-256
lines changed

11 files changed

+335
-256
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.CommandLine;
6+
7+
namespace Microsoft.OpenApi.Hidi.Extensions
8+
{
9+
internal static class CommandExtensions
10+
{
11+
public static void AddOptions(this Command command, IReadOnlyList<Option> options)
12+
{
13+
foreach (var option in options)
14+
{
15+
command.AddOption(option);
16+
}
17+
}
18+
}
19+
}

src/Microsoft.OpenApi.Hidi/Handlers/ShowCommandHandler.cs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,35 @@
22
// Licensed under the MIT license.
33

44
using System;
5-
using System.CommandLine;
65
using System.CommandLine.Invocation;
7-
using System.IO;
86
using System.Threading;
97
using System.Threading.Tasks;
108
using Microsoft.Extensions.Logging;
9+
using Microsoft.OpenApi.Hidi.Options;
1110

1211
namespace Microsoft.OpenApi.Hidi.Handlers
1312
{
1413
internal class ShowCommandHandler : ICommandHandler
1514
{
16-
public Option<string> DescriptionOption { get; set; }
17-
public Option<FileInfo> OutputOption { get; set; }
18-
public Option<LogLevel> LogLevelOption { get; set; }
19-
public Option<string> CsdlOption { get; set; }
20-
public Option<string> CsdlFilterOption { get; set; }
21-
22-
15+
public CommandOptions CommandOptions { get; set; }
16+
public ShowCommandHandler(CommandOptions commandOptions)
17+
{
18+
CommandOptions = commandOptions;
19+
}
2320
public int Invoke(InvocationContext context)
2421
{
2522
return InvokeAsync(context).GetAwaiter().GetResult();
2623
}
2724
public async Task<int> InvokeAsync(InvocationContext context)
2825
{
29-
string openapi = context.ParseResult.GetValueForOption(DescriptionOption);
30-
FileInfo output = context.ParseResult.GetValueForOption(OutputOption);
31-
LogLevel logLevel = context.ParseResult.GetValueForOption(LogLevelOption);
32-
string csdlFilter = context.ParseResult.GetValueForOption(CsdlFilterOption);
33-
string csdl = context.ParseResult.GetValueForOption(CsdlOption);
26+
HidiOptions hidiOptions = new HidiOptions(context.ParseResult, CommandOptions);
3427
CancellationToken cancellationToken = (CancellationToken)context.BindingContext.GetService(typeof(CancellationToken));
3528

36-
using var loggerFactory = Logger.ConfigureLogger(logLevel);
29+
using var loggerFactory = Logger.ConfigureLogger(hidiOptions.LogLevel);
3730
var logger = loggerFactory.CreateLogger<OpenApiService>();
3831
try
3932
{
40-
await OpenApiService.ShowOpenApiDocument(openapi, csdl, csdlFilter, output, logger, cancellationToken);
33+
await OpenApiService.ShowOpenApiDocument(hidiOptions.OpenApi, hidiOptions.Csdl, hidiOptions.CsdlFilter, hidiOptions.Output, logger, cancellationToken);
4134

4235
return 0;
4336
}

src/Microsoft.OpenApi.Hidi/Handlers/TransformCommandHandler.cs

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,35 @@
22
// Licensed under the MIT license.
33

44
using System;
5-
using System.CommandLine;
65
using System.CommandLine.Invocation;
7-
using System.IO;
86
using System.Threading;
97
using System.Threading.Tasks;
108
using Microsoft.Extensions.Logging;
9+
using Microsoft.OpenApi.Hidi.Options;
1110

1211
namespace Microsoft.OpenApi.Hidi.Handlers
1312
{
1413
internal class TransformCommandHandler : ICommandHandler
1514
{
16-
public Option<string> DescriptionOption { get; set; }
17-
public Option<string> CsdlOption { get; set; }
18-
public Option<string> CsdlFilterOption { get; set; }
19-
public Option<FileInfo> OutputOption { get; set; }
20-
public Option<bool> CleanOutputOption { get; set; }
21-
public Option<string?> VersionOption { get; set; }
22-
public Option<string?> MetadataVersionOption { get; set; }
23-
public Option<OpenApiFormat?> FormatOption { get; set; }
24-
public Option<bool> TerseOutputOption { get; set; }
25-
public Option<string> SettingsFileOption { get; set; }
26-
public Option<LogLevel> LogLevelOption { get; set; }
27-
public Option<string> FilterByOperationIdsOption { get; set; }
28-
public Option<string> FilterByTagsOption { get; set; }
29-
public Option<string> FilterByCollectionOption { get; set; }
30-
public Option<bool> InlineLocalOption { get; set; }
31-
public Option<bool> InlineExternalOption { get; set; }
32-
public Option<string?> LanguageFormatOption { get; set; }
33-
15+
public CommandOptions CommandOptions { get; }
16+
public TransformCommandHandler(CommandOptions commandOptions)
17+
{
18+
CommandOptions = commandOptions;
19+
}
3420
public int Invoke(InvocationContext context)
3521
{
3622
return InvokeAsync(context).GetAwaiter().GetResult();
3723
}
3824
public async Task<int> InvokeAsync(InvocationContext context)
3925
{
40-
string openapi = context.ParseResult.GetValueForOption(DescriptionOption);
41-
string csdlFilter = context.ParseResult.GetValueForOption(CsdlFilterOption);
42-
string csdl = context.ParseResult.GetValueForOption(CsdlOption);
43-
FileInfo output = context.ParseResult.GetValueForOption(OutputOption);
44-
bool cleanOutput = context.ParseResult.GetValueForOption(CleanOutputOption);
45-
string? version = context.ParseResult.GetValueForOption(VersionOption);
46-
string metadataVersion = context.ParseResult.GetValueForOption(MetadataVersionOption);
47-
OpenApiFormat? format = context.ParseResult.GetValueForOption(FormatOption);
48-
bool terseOutput = context.ParseResult.GetValueForOption(TerseOutputOption);
49-
string settingsFile = context.ParseResult.GetValueForOption(SettingsFileOption);
50-
LogLevel logLevel = context.ParseResult.GetValueForOption(LogLevelOption);
51-
bool inlineLocal = context.ParseResult.GetValueForOption(InlineLocalOption);
52-
bool inlineExternal = context.ParseResult.GetValueForOption(InlineExternalOption);
53-
string? languageFormatOption = context.ParseResult.GetValueForOption(LanguageFormatOption);
54-
string filterbyoperationids = context.ParseResult.GetValueForOption(FilterByOperationIdsOption);
55-
string filterbytags = context.ParseResult.GetValueForOption(FilterByTagsOption);
56-
string filterbycollection = context.ParseResult.GetValueForOption(FilterByCollectionOption);
57-
26+
HidiOptions hidiOptions = new HidiOptions(context.ParseResult, CommandOptions);
5827
CancellationToken cancellationToken = (CancellationToken)context.BindingContext.GetService(typeof(CancellationToken));
5928

60-
using var loggerFactory = Logger.ConfigureLogger(logLevel);
29+
using var loggerFactory = Logger.ConfigureLogger(hidiOptions.LogLevel);
6130
var logger = loggerFactory.CreateLogger<OpenApiService>();
6231
try
6332
{
64-
await OpenApiService.TransformOpenApiDocument(openapi, csdl, csdlFilter, output, cleanOutput, version, metadataVersion, format, terseOutput, settingsFile, inlineLocal, inlineExternal, languageFormatOption, filterbyoperationids, filterbytags, filterbycollection, logger, cancellationToken);
33+
await OpenApiService.TransformOpenApiDocument(hidiOptions, logger, cancellationToken);
6534

6635
return 0;
6736
}

src/Microsoft.OpenApi.Hidi/Handlers/ValidateCommandHandler.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,36 @@
22
// Licensed under the MIT license.
33

44
using System;
5-
using System.CommandLine;
65
using System.CommandLine.Invocation;
76
using System.Threading;
87
using System.Threading.Tasks;
98
using Microsoft.Extensions.Logging;
9+
using Microsoft.OpenApi.Hidi.Options;
1010

1111
namespace Microsoft.OpenApi.Hidi.Handlers
1212
{
1313
internal class ValidateCommandHandler : ICommandHandler
1414
{
15-
public Option<string> DescriptionOption { get; set; }
16-
public Option<LogLevel> LogLevelOption { get; set; }
15+
public CommandOptions CommandOptions { get; }
16+
17+
public ValidateCommandHandler(CommandOptions commandOptions)
18+
{
19+
CommandOptions = commandOptions;
20+
}
1721

1822
public int Invoke(InvocationContext context)
1923
{
2024
return InvokeAsync(context).GetAwaiter().GetResult();
2125
}
2226
public async Task<int> InvokeAsync(InvocationContext context)
2327
{
24-
string openapi = context.ParseResult.GetValueForOption(DescriptionOption);
25-
LogLevel logLevel = context.ParseResult.GetValueForOption(LogLevelOption);
28+
HidiOptions hidiOptions = new HidiOptions(context.ParseResult, CommandOptions);
2629
CancellationToken cancellationToken = (CancellationToken)context.BindingContext.GetService(typeof(CancellationToken));
27-
28-
29-
using var loggerFactory = Logger.ConfigureLogger(logLevel);
30+
using var loggerFactory = Logger.ConfigureLogger(hidiOptions.LogLevel);
3031
var logger = loggerFactory.CreateLogger<OpenApiService>();
3132
try
3233
{
33-
await OpenApiService.ValidateOpenApiDocument(openapi, logger, cancellationToken);
34+
await OpenApiService.ValidateOpenApiDocument(hidiOptions.OpenApi, logger, cancellationToken);
3435
return 0;
3536
}
3637
catch (Exception ex)

src/Microsoft.OpenApi.Hidi/OpenApiService.cs

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -25,73 +25,59 @@
2525
using System.Xml.Xsl;
2626
using System.Xml;
2727
using System.Reflection;
28+
using Microsoft.OpenApi.Hidi.Options;
2829
using Microsoft.Extensions.Configuration;
30+
using Microsoft.OpenApi.Hidi.Utilities;
2931
using Microsoft.OpenApi.Hidi.Formatters;
3032

3133
namespace Microsoft.OpenApi.Hidi
3234
{
33-
public class OpenApiService
35+
internal class OpenApiService
3436
{
3537
/// <summary>
3638
/// Implementation of the transform command
3739
/// </summary>
38-
public static async Task TransformOpenApiDocument(
39-
string openapi,
40-
string csdl,
41-
string csdlFilter,
42-
FileInfo output,
43-
bool cleanoutput,
44-
string? version,
45-
string metadataVersion,
46-
OpenApiFormat? format,
47-
bool terseOutput,
48-
string settingsFile,
49-
bool inlineLocal,
50-
bool inlineExternal,
51-
string? languageFormatOption,
52-
string filterbyoperationids,
53-
string filterbytags,
54-
string filterbycollection,
55-
ILogger logger,
56-
CancellationToken cancellationToken
57-
)
40+
public static async Task TransformOpenApiDocument(HidiOptions options, ILogger logger, CancellationToken cancellationToken)
5841
{
59-
if (string.IsNullOrEmpty(openapi) && string.IsNullOrEmpty(csdl))
42+
if (string.IsNullOrEmpty(options.OpenApi) && string.IsNullOrEmpty(options.Csdl))
6043
{
6144
throw new ArgumentException("Please input a file path or URL");
6245
}
6346

6447
try
6548
{
66-
if (output == null)
49+
if (options.Output == null)
6750
{
68-
var inputExtension = GetInputPathExtension(openapi, csdl);
69-
output = new FileInfo($"./output{inputExtension}");
51+
var inputExtension = GetInputPathExtension(options.OpenApi, options.Csdl);
52+
options.Output = new FileInfo($"./output{inputExtension}");
7053
};
7154

72-
if (cleanoutput && output.Exists)
55+
if (options.CleanOutput && options.Output.Exists)
7356
{
74-
output.Delete();
57+
options.Output.Delete();
7558
}
76-
if (output.Exists)
59+
if (options.Output.Exists)
7760
{
78-
throw new IOException($"The file {output} already exists. Please input a new file path.");
61+
throw new IOException($"The file {options.Output} already exists. Please input a new file path.");
7962
}
8063

8164
// Default to yaml and OpenApiVersion 3 during csdl to OpenApi conversion
82-
OpenApiFormat openApiFormat = format ?? (!string.IsNullOrEmpty(openapi) ? GetOpenApiFormat(openapi, logger) : OpenApiFormat.Yaml);
83-
OpenApiSpecVersion openApiVersion = version != null ? TryParseOpenApiSpecVersion(version) : OpenApiSpecVersion.OpenApi3_0;
84-
85-
OpenApiDocument document = await GetOpenApi(openapi, csdl, csdlFilter, settingsFile, inlineExternal, logger, cancellationToken, metadataVersion);
86-
document = await FilterOpenApiDocument(filterbyoperationids, filterbytags, filterbycollection, document, logger, cancellationToken);
87-
if (!string.IsNullOrWhiteSpace(languageFormatOption) && languageFormatOption.Equals("PowerShell", StringComparison.InvariantCultureIgnoreCase))
65+
OpenApiFormat openApiFormat = options.OpenApiFormat ?? (!string.IsNullOrEmpty(options.OpenApi) ? GetOpenApiFormat(options.OpenApi, logger) : OpenApiFormat.Yaml);
66+
OpenApiSpecVersion openApiVersion = options.Version != null ? TryParseOpenApiSpecVersion(options.Version) : OpenApiSpecVersion.OpenApi3_0;
67+
68+
OpenApiDocument document = await GetOpenApi(options.OpenApi, options.Csdl, options.CsdlFilter, options.SettingsConfig, options.InlineExternal, logger, cancellationToken, options.MetadataVersion);
69+
if (options.FilterOptions != null)
70+
document = await FilterOpenApiDocument(options.FilterOptions.FilterByOperationIds, options.FilterOptions.FilterByTags, options.FilterOptions.FilterByCollection, document, logger, cancellationToken);
71+
// TODO: Handle PS formating
72+
var languageFormat = options.SettingsConfig.GetSection("LanguageFormat").Value;
73+
if (!string.IsNullOrWhiteSpace(languageFormat) && languageFormat.Equals("PowerShell", StringComparison.InvariantCultureIgnoreCase))
8874
{
8975
// PowerShell Walker.
9076
var powerShellFormatter = new PowerShellFormatter();
9177
var walker = new OpenApiWalker(powerShellFormatter);
9278
walker.Walk(document);
9379
}
94-
WriteOpenApi(output, terseOutput, inlineLocal, inlineExternal, openApiFormat, openApiVersion, document, logger);
80+
WriteOpenApi(options.Output, options.TerseOutput, options.InlineLocal, options.InlineExternal, openApiFormat, openApiVersion, document, logger);
9581
}
9682
catch (TaskCanceledException)
9783
{
@@ -140,7 +126,7 @@ private static void WriteOpenApi(FileInfo output, bool terseOutput, bool inlineL
140126
}
141127

142128
// Get OpenAPI document either from OpenAPI or CSDL
143-
private static async Task<OpenApiDocument> GetOpenApi(string openapi, string csdl, string csdlFilter, string settingsFile, bool inlineExternal, ILogger logger, CancellationToken cancellationToken, string metadataVersion = null)
129+
private static async Task<OpenApiDocument> GetOpenApi(string openapi, string csdl, string csdlFilter, IConfiguration settings, bool inlineExternal, ILogger logger, CancellationToken cancellationToken, string metadataVersion = null)
144130
{
145131
OpenApiDocument document;
146132
Stream stream;
@@ -162,7 +148,7 @@ private static async Task<OpenApiDocument> GetOpenApi(string openapi, string csd
162148
stream = null;
163149
}
164150

165-
document = await ConvertCsdlToOpenApi(filteredStream ?? stream, metadataVersion, settingsFile, cancellationToken);
151+
document = await ConvertCsdlToOpenApi(filteredStream ?? stream, metadataVersion, settings, cancellationToken);
166152
stopwatch.Stop();
167153
logger.LogTrace("{timestamp}ms: Generated OpenAPI with {paths} paths.", stopwatch.ElapsedMilliseconds, document.Paths.Count);
168154
}
@@ -309,39 +295,19 @@ private static async Task<ReadResult> ParseOpenApi(string openApiFile, bool inli
309295
return result;
310296
}
311297

312-
internal static IConfiguration GetConfiguration(string settingsFile)
313-
{
314-
settingsFile ??= "appsettings.json";
315-
316-
IConfiguration config = new ConfigurationBuilder()
317-
.AddJsonFile(settingsFile, true)
318-
.Build();
319-
320-
return config;
321-
}
322-
323298
/// <summary>
324299
/// Converts CSDL to OpenAPI
325300
/// </summary>
326301
/// <param name="csdl">The CSDL stream.</param>
327302
/// <returns>An OpenAPI document.</returns>
328-
public static async Task<OpenApiDocument> ConvertCsdlToOpenApi(Stream csdl, string metadataVersion = null, string settingsFile = null, CancellationToken token = default)
303+
public static async Task<OpenApiDocument> ConvertCsdlToOpenApi(Stream csdl, string metadataVersion = null, IConfiguration settings = null, CancellationToken token = default)
329304
{
330305
using var reader = new StreamReader(csdl);
331306
var csdlText = await reader.ReadToEndAsync(token);
332307
var edmModel = CsdlReader.Parse(XElement.Parse(csdlText).CreateReader());
308+
settings ??= SettingsUtilities.GetConfiguration();
333309

334-
var config = GetConfiguration(settingsFile);
335-
var settings = new OpenApiConvertSettings();
336-
337-
if (!string.IsNullOrEmpty(metadataVersion))
338-
{
339-
settings.SemVerVersion = metadataVersion;
340-
}
341-
342-
config.GetSection("OpenApiConvertSettings").Bind(settings);
343-
344-
OpenApiDocument document = edmModel.ConvertToOpenApi(settings);
310+
OpenApiDocument document = edmModel.ConvertToOpenApi(SettingsUtilities.GetOpenApiConvertSettings(settings, metadataVersion));
345311
document = FixReferences(document);
346312

347313
return document;

0 commit comments

Comments
 (0)