NodePipeline/NodePipeline.Engine.DependencyInjection.CodeGeneration/DiExtensionsGenerator.cs
2026-01-02 20:55:25 +03:00

163 lines
6.9 KiB
C#

using System.Text;
using NodePipeline.Engine.CodeGeneration.Abstractions;
namespace NodePipeline.Engine.DependencyInjection.CodeGeneration;
internal static class DiExtensionsGenerator
{
public static string Generate(NodeModelBuilder.NodesModel model)
{
var sb = new StringBuilder();
sb.AppendLine("using System.Globalization;");
sb.AppendLine("using Microsoft.Extensions.DependencyInjection;");
sb.AppendLine("using NodePipeline.Abstractions;");
sb.AppendLine("using NodePipeline.Abstractions.Interfaces;");
sb.AppendLine("using NodePipeline.Abstractions.Interfaces.Nodes;");
sb.AppendLine("using NodePipeline.Abstractions.Interfaces.Validation;");
sb.AppendLine("using NodePipeline.Engine.Abstractions;");
sb.AppendLine("using NodePipeline.Engine.Execution;");
sb.AppendLine("using NodePipeline.Engine.Generated;");
sb.AppendLine();
sb.AppendLine("#nullable enable");
sb.AppendLine();
sb.AppendLine("namespace NodePipeline.Engine.DependencyInjection;");
sb.AppendLine();
sb.AppendLine("public static class PipelineServiceCollectionExtensions");
sb.AppendLine("{");
sb.AppendLine(BuildAddPipelineMethod());
sb.AppendLine();
sb.AppendLine(BuildAddNodeFactoryMethod());
sb.AppendLine();
sb.AppendLine(BuildAddNodeValidatorMethod());
sb.AppendLine();
sb.AppendLine("}");
sb.AppendLine();
sb.AppendLine(BuildPipelineProviderExtensionsClass());
sb.AppendLine();
sb.AppendLine(BuildPipelineNodeExtensionsClass());
sb.AppendLine();
sb.AppendLine(BuildPipelineNodeValidatorExtensionsClass());
sb.AppendLine();
sb.AppendLine(BuildPipelineFieldValidatorExtensionsClass());
sb.AppendLine("#nullable restore");
return sb.ToString();
}
private static string BuildAddPipelineMethod()
{
var sb = new StringBuilder();
sb.AppendLine(" public static IServiceCollection AddPipeline(this IServiceCollection services)");
sb.AppendLine(" {");
sb.AppendLine(" services.AddSingleton<IPipelineLocalizationProvider, PipelineLocalizationProvider>();");
sb.AppendLine();
sb.AppendLine(" AddNodeFactory(services);");
sb.AppendLine(" AddNodeValidator(services);");
sb.AppendLine();
sb.AppendLine(" services.AddSingleton(sp => new PipelineRegistry(CultureInfo.CurrentCulture));");
sb.AppendLine(" return services;");
sb.AppendLine(" }");
return sb.ToString();
}
private static string BuildAddNodeFactoryMethod()
{
var sb = new StringBuilder();
sb.AppendLine(" private static void AddNodeFactory(IServiceCollection services)");
sb.AppendLine(" {");
sb.AppendLine(" services.AddScoped<GeneratedNodeFactory>();");
sb.AppendLine(" services.AddScoped<INodeFactory>(sp =>");
sb.AppendLine(" {");
sb.AppendLine(" var inner = sp.GetRequiredService<GeneratedNodeFactory>();");
sb.AppendLine(
" return new DiNodeFactory(sp, inner, sp.GetService<IPipelineLocalizationProvider>());");
sb.AppendLine(" });");
sb.AppendLine(" }");
return sb.ToString();
}
private static string BuildAddNodeValidatorMethod()
{
var sb = new StringBuilder();
sb.AppendLine(" private static void AddNodeValidator(IServiceCollection services)");
sb.AppendLine(" {");
sb.AppendLine(" services.AddScoped<GeneratedNodeValidator>();");
sb.AppendLine(" services.AddScoped<IPipelineNodeValidator>(sp =>");
sb.AppendLine(" {");
sb.AppendLine(" var inner = sp.GetRequiredService<GeneratedNodeValidator>();");
sb.AppendLine(
" return new DiNodeValidator(sp, inner, sp.GetService<IPipelineLocalizationProvider>());");
sb.AppendLine(" });");
sb.AppendLine(" }");
return sb.ToString();
}
//classes
private static string BuildPipelineProviderExtensionsClass()
{
var sb = new StringBuilder();
sb.AppendLine("public static class PipelineProviderExtensions");
sb.AppendLine("{");
sb.AppendLine(
" public static IServiceCollection AddPipelineProvider<TInterface, TImplementation>(this IServiceCollection services)");
sb.AppendLine(" where TInterface : class");
sb.AppendLine(" where TImplementation : class, TInterface");
sb.AppendLine(" {");
sb.AppendLine(" services.AddScoped<TImplementation>();");
sb.AppendLine(" services.AddScoped<TInterface>(sp => sp.GetRequiredService<TImplementation>());");
sb.AppendLine(" return services;");
sb.AppendLine(" }");
sb.AppendLine("}");
return sb.ToString();
}
private static string BuildPipelineNodeExtensionsClass()
{
var sb = new StringBuilder();
sb.AppendLine("public static class PipelineNodeExtensions");
sb.AppendLine("{");
sb.AppendLine(" public static IServiceCollection AddPipelineNode<TNode>(this IServiceCollection services)");
sb.AppendLine(" where TNode : class, INode");
sb.AppendLine(" {");
sb.AppendLine(" services.AddScoped<TNode>();");
sb.AppendLine(" return services;");
sb.AppendLine(" }");
sb.AppendLine("}");
return sb.ToString();
}
private static string BuildPipelineNodeValidatorExtensionsClass()
{
var sb = new StringBuilder();
sb.AppendLine("public static class PipelineNodeValidatorExtensions");
sb.AppendLine("{");
sb.AppendLine(
" public static IServiceCollection AddPipelineNodeValidator<TValidator>(this IServiceCollection services)");
sb.AppendLine(" where TValidator : class, INodeValidator");
sb.AppendLine(" {");
sb.AppendLine(" services.AddTransient<TValidator>();");
sb.AppendLine(" return services;");
sb.AppendLine(" }");
sb.AppendLine("}");
return sb.ToString();
}
private static string BuildPipelineFieldValidatorExtensionsClass()
{
var sb = new StringBuilder();
sb.AppendLine("public static class PipelineFieldValidatorExtensions");
sb.AppendLine("{");
sb.AppendLine(
" public static IServiceCollection AddPipelineNodeFieldValidator<TValidator>(this IServiceCollection services)");
sb.AppendLine(" where TValidator : class, INodeFieldValidator");
sb.AppendLine(" {");
sb.AppendLine(" services.AddTransient<TValidator>();");
sb.AppendLine(" return services;");
sb.AppendLine(" }");
sb.AppendLine("}");
return sb.ToString();
}
}