tools/code/extractor/ProductGroup.cs (92 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.Linq; using System.Threading; using System.Threading.Tasks; namespace extractor; public delegate ValueTask ExtractProductGroups(ProductName productName, CancellationToken cancellationToken); public delegate IAsyncEnumerable<(GroupName Name, ProductGroupDto Dto)> ListProductGroups(ProductName productName, CancellationToken cancellationToken); public delegate ValueTask WriteProductGroupArtifacts(GroupName name, ProductGroupDto dto, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask WriteProductGroupInformationFile(GroupName name, ProductGroupDto dto, ProductName productName, CancellationToken cancellationToken); internal static class ProductGroupModule { public static void ConfigureExtractProductGroups(IHostApplicationBuilder builder) { ConfigureListProductGroups(builder); ConfigureWriteProductGroupArtifacts(builder); builder.Services.TryAddSingleton(GetExtractProductGroups); } private static ExtractProductGroups GetExtractProductGroups(IServiceProvider provider) { var list = provider.GetRequiredService<ListProductGroups>(); var writeArtifacts = provider.GetRequiredService<WriteProductGroupArtifacts>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async (productName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(ExtractProductGroups)); logger.LogInformation("Extracting groups for product {ProductName}...", productName); await list(productName, cancellationToken) .IterParallel(async resource => await writeArtifacts(resource.Name, resource.Dto, productName, cancellationToken), cancellationToken); }; } private static void ConfigureListProductGroups(IHostApplicationBuilder builder) { ConfigurationModule.ConfigureFindConfigurationNamesFactory(builder); AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetListProductGroups); } private static ListProductGroups GetListProductGroups(IServiceProvider provider) { var findConfigurationNamesFactory = provider.GetRequiredService<FindConfigurationNamesFactory>(); var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); var findConfigurationGroups = findConfigurationNamesFactory.Create<GroupName>(); return (productName, cancellationToken) => { var productGroupsUri = ProductGroupsUri.From(productName, serviceUri); var resources = productGroupsUri.List(pipeline, cancellationToken); return resources.Where(resource => shouldExtractGroup(resource.Name)); }; bool shouldExtractGroup(GroupName name) => findConfigurationGroups() .Map(names => names.Contains(name)) .IfNone(true); } private static void ConfigureWriteProductGroupArtifacts(IHostApplicationBuilder builder) { ConfigureWriteProductGroupInformationFile(builder); builder.Services.TryAddSingleton(GetWriteProductGroupArtifacts); } private static WriteProductGroupArtifacts GetWriteProductGroupArtifacts(IServiceProvider provider) { var writeInformationFile = provider.GetRequiredService<WriteProductGroupInformationFile>(); return async (name, dto, productName, cancellationToken) => await writeInformationFile(name, dto, productName, cancellationToken); } private static void ConfigureWriteProductGroupInformationFile(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetWriteProductGroupInformationFile); } private static WriteProductGroupInformationFile GetWriteProductGroupInformationFile(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, productName, cancellationToken) => { var informationFile = ProductGroupInformationFile.From(name, productName, serviceDirectory); logger.LogInformation("Writing product group information file {ProductGroupInformationFile}...", informationFile); await informationFile.WriteDto(dto, cancellationToken); }; } }