using Autofac; using Microsoft.CodeAnalysis; using NSwag; using Nustache.Core; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace LibKubernetesGenerator { [Generator] public class KubernetesClientSourceGenerator : ISourceGenerator { private static object execlock = new object(); public void ExecuteInner(GeneratorExecutionContext context) { lock (execlock) { var swaggerfile = context.AdditionalFiles.First(f => f.Path.EndsWith("swagger.json")); var swagger = OpenApiDocument.FromJsonAsync(swaggerfile.GetText().ToString()).GetAwaiter().GetResult(); var builder = new ContainerBuilder(); builder.RegisterType() .WithParameter(new NamedParameter(nameof(swagger), swagger)) .AsSelf() .AsImplementedInterfaces() ; builder.RegisterType() .AsImplementedInterfaces() ; builder.RegisterType() .AsImplementedInterfaces() ; builder.RegisterType() .WithParameter(new TypedParameter(typeof(OpenApiDocument), swagger)) .AsImplementedInterfaces() ; builder.RegisterType() .AsSelf() .AsImplementedInterfaces() ; builder.RegisterType() .AsSelf() .AsImplementedInterfaces() ; builder.RegisterType() .AsImplementedInterfaces() ; builder.RegisterType() .AsImplementedInterfaces() ; builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); var container = builder.Build(); // TODO move to Handlebars.Net { var ch = typeof(Helpers).GetField("CustomHelpers", BindingFlags.Static | BindingFlags.NonPublic); ((Dictionary)ch.GetValue(null)).Clear(); } foreach (var helper in container.Resolve>()) { helper.RegisterHelper(); } container.Resolve().Generate(swagger, context); container.Resolve().Generate(swagger, context); container.Resolve().Generate(swagger, context); container.Resolve().Generate(swagger, context); } } public void Execute(GeneratorExecutionContext context) { try { ExecuteInner(context); } catch (Exception e) { context.ReportDiagnostic(Diagnostic.Create( new DiagnosticDescriptor( "K8SCSG01", e.Message, e.StackTrace, "Kubernetes C# code generator", DiagnosticSeverity.Error, true), Location.None)); } } public void Initialize(GeneratorInitializationContext context) { #if DEBUG // if (!Debugger.IsAttached) // { // Debugger.Launch(); // } #endif } } }