tools/code/extractor/ApiOperation.cs (52 lines of code) (raw):
using Azure.Core.Pipeline;
using common;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace extractor;
public delegate ValueTask ExtractApiOperations(ApiName apiName, CancellationToken cancellationToken);
public delegate IAsyncEnumerable<ApiOperationName> ListApiOperations(ApiName apiName, CancellationToken cancellationToken);
internal static class ApiOperationModule
{
public static void ConfigureExtractApiOperations(IHostApplicationBuilder builder)
{
ConfigureListApiOperations(builder);
ApiOperationPolicyModule.ConfigureExtractApiOperationPolicies(builder);
builder.Services.TryAddSingleton(GetExtractApiOperations);
}
private static ExtractApiOperations GetExtractApiOperations(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListApiOperations>();
var extractPolicies = provider.GetRequiredService<ExtractApiOperationPolicies>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async (apiName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(ExtractApiOperations));
logger.LogInformation("Extracting API operations for {ApiName}...", apiName);
await list(apiName, cancellationToken)
.IterParallel(async name => await extractPolicies(name, apiName, cancellationToken),
cancellationToken);
};
}
private static void ConfigureListApiOperations(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListApiOperations);
}
private static ListApiOperations GetListApiOperations(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
return (apiName, cancellationToken) =>
ApiOperationsUri.From(apiName, serviceUri)
.ListNames(pipeline, cancellationToken);
}
}