tools/code/extractor/ApiSpecification.cs (62 lines of code) (raw):
using common;
using LanguageExt;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using System;
namespace extractor;
internal sealed record DefaultApiSpecification(ApiSpecification Value);
internal static class ApiSpecificationModule
{
public static void ConfigureDefaultApiSpecification(IHostApplicationBuilder builder)
{
builder.Services.TryAddSingleton(GetDefaultApiSpecification);
}
private static DefaultApiSpecification GetDefaultApiSpecification(IServiceProvider provider)
{
var configuration = provider.GetRequiredService<IConfiguration>();
var formatOption = configuration.TryGetValue("API_SPECIFICATION_FORMAT")
| configuration.TryGetValue("apiSpecificationFormat");
var specification = formatOption.Map(format => format switch
{
var value when "Wadl".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.Wadl() as ApiSpecification,
var value when "JSON".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Json(),
Version = new OpenApiVersion.V3()
},
var value when "YAML".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Yaml(),
Version = new OpenApiVersion.V3()
},
var value when "OpenApiV2Json".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Json(),
Version = new OpenApiVersion.V2()
},
var value when "OpenApiV2Yaml".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Yaml(),
Version = new OpenApiVersion.V2()
},
var value when "OpenApiV3Json".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Json(),
Version = new OpenApiVersion.V3()
},
var value when "OpenApiV3Yaml".Equals(value, StringComparison.OrdinalIgnoreCase) => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Yaml(),
Version = new OpenApiVersion.V3()
},
var value => throw new NotSupportedException($"API specification format '{value}' defined in configuration is not supported.")
}).IfNone(() => new ApiSpecification.OpenApi
{
Format = new OpenApiFormat.Yaml(),
Version = new OpenApiVersion.V3()
});
return new DefaultApiSpecification(specification);
}
}