2021-12-22 17:16:44 -08:00
|
|
|
using Autofac;
|
|
|
|
|
using Microsoft.CodeAnalysis;
|
|
|
|
|
using NSwag;
|
|
|
|
|
using Nustache.Core;
|
2023-10-10 09:49:47 -07:00
|
|
|
#if GENERATE_AUTOMAPPER
|
2021-12-22 17:16:44 -08:00
|
|
|
using System;
|
2023-10-10 09:49:47 -07:00
|
|
|
using System.IO;
|
2021-12-22 17:16:44 -08:00
|
|
|
using System.Linq;
|
2023-10-10 09:49:47 -07:00
|
|
|
#endif
|
|
|
|
|
using System.Collections.Generic;
|
2021-12-22 17:16:44 -08:00
|
|
|
using System.Reflection;
|
|
|
|
|
|
|
|
|
|
namespace LibKubernetesGenerator
|
|
|
|
|
{
|
|
|
|
|
[Generator]
|
2023-10-10 09:49:47 -07:00
|
|
|
public class KubernetesClientSourceGenerator : IIncrementalGenerator
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2022-09-28 22:34:32 +02:00
|
|
|
private static readonly object Execlock = new object();
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
private static (OpenApiDocument, IContainer) BuildContainer()
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var swagger = OpenApiDocument.FromJsonAsync(EmbedResource.GetResource("swagger.json")).GetAwaiter().GetResult();
|
|
|
|
|
var container = BuildContainer(swagger);
|
|
|
|
|
// TODO move to Handlebars.Net
|
|
|
|
|
// here is to clean up the custom helpers in static Nustache.Core.Helpers
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var ch = typeof(Helpers).GetField("CustomHelpers", BindingFlags.Static | BindingFlags.NonPublic);
|
|
|
|
|
((Dictionary<string, Helper>)ch.GetValue(null)).Clear();
|
|
|
|
|
}
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
foreach (var helper in container.Resolve<IEnumerable<INustacheHelper>>())
|
|
|
|
|
{
|
|
|
|
|
helper.RegisterHelper();
|
|
|
|
|
}
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
return (swagger, container);
|
|
|
|
|
}
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
private static IContainer BuildContainer(OpenApiDocument swagger)
|
|
|
|
|
{
|
|
|
|
|
var builder = new ContainerBuilder();
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<ClassNameHelper>()
|
|
|
|
|
.WithParameter(new NamedParameter(nameof(swagger), swagger))
|
|
|
|
|
.AsSelf()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<StringHelpers>()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<MetaHelper>()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<PluralHelper>()
|
|
|
|
|
.WithParameter(new TypedParameter(typeof(OpenApiDocument), swagger))
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<GeneralNameHelper>()
|
|
|
|
|
.AsSelf()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<TypeHelper>()
|
|
|
|
|
.AsSelf()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<ParamHelper>()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<UtilHelper>()
|
|
|
|
|
.AsImplementedInterfaces()
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
builder.RegisterType<ModelExtGenerator>();
|
|
|
|
|
builder.RegisterType<ModelGenerator>();
|
|
|
|
|
builder.RegisterType<ApiGenerator>();
|
|
|
|
|
builder.RegisterType<VersionConverterStubGenerator>();
|
|
|
|
|
builder.RegisterType<VersionConverterAutoMapperGenerator>();
|
|
|
|
|
builder.RegisterType<VersionGenerator>();
|
|
|
|
|
|
|
|
|
|
return builder.Build();
|
|
|
|
|
}
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
public void Initialize(IncrementalGeneratorInitializationContext generatorContext)
|
|
|
|
|
{
|
|
|
|
|
#if GENERATE_BASIC
|
|
|
|
|
generatorContext.RegisterPostInitializationOutput(ctx =>
|
|
|
|
|
{
|
|
|
|
|
lock (Execlock)
|
2022-03-23 16:25:20 -07:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var (swagger, container) = BuildContainer();
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
container.Resolve<VersionGenerator>().Generate(swagger, ctx);
|
2021-12-22 17:16:44 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
container.Resolve<ModelGenerator>().Generate(swagger, ctx);
|
|
|
|
|
container.Resolve<ModelExtGenerator>().Generate(swagger, ctx);
|
|
|
|
|
container.Resolve<VersionConverterStubGenerator>().Generate(swagger, ctx);
|
2023-03-03 09:14:58 -08:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
container.Resolve<ApiGenerator>().Generate(swagger, ctx);
|
2022-03-23 16:25:20 -07:00
|
|
|
}
|
2023-10-10 09:49:47 -07:00
|
|
|
});
|
|
|
|
|
#endif
|
2022-04-18 14:55:51 -07:00
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
#if GENERATE_AUTOMAPPER
|
|
|
|
|
var automappersrc = generatorContext.CompilationProvider.Select((c, _) => c.SyntaxTrees.First(s => PathSuffixMath(s.FilePath, "AutoMapper/VersionConverter.cs")));
|
|
|
|
|
generatorContext.RegisterSourceOutput(automappersrc, (ctx, srctree) =>
|
|
|
|
|
{
|
|
|
|
|
lock (Execlock)
|
2022-04-18 14:55:51 -07:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var (swagger, container) = BuildContainer();
|
|
|
|
|
|
|
|
|
|
container.Resolve<VersionConverterAutoMapperGenerator>().Generate(swagger, ctx, srctree);
|
2022-04-18 14:55:51 -07:00
|
|
|
}
|
2023-10-10 09:49:47 -07:00
|
|
|
});
|
|
|
|
|
#endif
|
2021-12-22 17:16:44 -08:00
|
|
|
}
|
|
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
#if GENERATE_AUTOMAPPER
|
|
|
|
|
private IEnumerable<string> PathSplit(string path)
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var p = path;
|
|
|
|
|
|
|
|
|
|
while (!string.IsNullOrEmpty(p))
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
yield return Path.GetFileName(p);
|
|
|
|
|
p = Path.GetDirectoryName(p);
|
2021-12-22 17:16:44 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-10 09:49:47 -07:00
|
|
|
private bool PathSuffixMath(string path, string suffix)
|
2021-12-22 17:16:44 -08:00
|
|
|
{
|
2023-10-10 09:49:47 -07:00
|
|
|
var s = PathSplit(suffix).ToList();
|
|
|
|
|
return PathSplit(path).Take(s.Count).SequenceEqual(s);
|
2022-09-28 22:34:32 +02:00
|
|
|
}
|
2023-10-10 09:49:47 -07:00
|
|
|
#endif
|
2021-12-22 17:16:44 -08:00
|
|
|
}
|
|
|
|
|
}
|