diff --git a/kubernetes-client.sln b/kubernetes-client.sln
index 4dfcda28c..f70cb88a9 100644
--- a/kubernetes-client.sln
+++ b/kubernetes-client.sln
@@ -1,4 +1,4 @@
-
+3D1864AA-1FFC-4512-BB13-46055E410F73
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
@@ -19,8 +19,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "simple", "examples\simple\s
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "watch", "examples\watch\watch.csproj", "{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3D1864AA-1FFC-4512-BB13-46055E410F73}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubernetesClient", "src\KubernetesClient\KubernetesClient.csproj", "{35DD7248-F9EC-4272-A32C-B0C59E5A6FA7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}"
@@ -39,8 +37,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "customResource", "examples\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "generic", "examples\generic\generic.csproj", "{F06D4C3A-7825-43A8-832B-6BDE3D355486}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibKubernetesGenerator", "src\LibKubernetesGenerator\LibKubernetesGenerator.csproj", "{64C71596-B916-46EF-8115-B53E238F79D4}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "portforward", "examples\portforward\portforward.csproj", "{DFBB1025-BD22-459D-A04D-E2AB31E129E2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "prometheus", "examples\prometheus\prometheus.csproj", "{682B94E4-1761-48FF-B5D0-87B45DC0C735}"
@@ -451,7 +447,6 @@ Global
{1AA79D75-E7C4-4C0C-928B-FB12EC3CBF68} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{DDB14203-DD5B-452A-A1E0-9FD98629101F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
- {35DD7248-F9EC-4272-A32C-B0C59E5A6FA7} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
{806AD0E5-833F-42FB-A870-4BCEE7F4B17F} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
{04DE2C84-117D-4E21-8B45-B7AE627697BD} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{B9647AD4-F6B0-406F-8B79-6781E31600EC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
@@ -459,21 +454,17 @@ Global
{4D2AE427-F856-49E5-B61D-EA6B17D89051} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
{95672061-5799-4454-ACDB-D6D330DB1EC4} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{F06D4C3A-7825-43A8-832B-6BDE3D355486} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
- {64C71596-B916-46EF-8115-B53E238F79D4} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
{DFBB1025-BD22-459D-A04D-E2AB31E129E2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{682B94E4-1761-48FF-B5D0-87B45DC0C735} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{17AB0AD8-6C90-42DD-880C-16B5AC4A373F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
- {80F19E8A-F097-4AA4-A68C-D417B96BBC68} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
{FD90C861-56C6-4536-B7F5-AC7779296384} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
{F626860C-F141-45B3-9DDD-88AD3932ACAF} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{973CCB4A-F344-4C4F-81A5-0F40F7F43C07} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
- {21201F30-5463-4FC6-93C3-FBF157F0D46C} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
{9128F6DC-6B7A-417F-937A-90461D6989A8} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
{8E266190-AE6E-44A8-948D-BD974AA82428} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{C0759F88-A010-4DEF-BD3B-E183D3328FFC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{05DC8884-AC54-4603-AC25-AE9D9F24E7AE} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{CC41E248-2139-427E-8DD4-B047A8924FD2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
- {F1C8276A-8A60-4362-96B8-A006314446AE} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}
diff --git a/src/KubernetesClient.Classic/KubernetesClient.Classic.csproj b/src/KubernetesClient.Classic/KubernetesClient.Classic.csproj
index 8d5ea9471..3f8d0112a 100644
--- a/src/KubernetesClient.Classic/KubernetesClient.Classic.csproj
+++ b/src/KubernetesClient.Classic/KubernetesClient.Classic.csproj
@@ -124,10 +124,7 @@
-
-
-
\ No newline at end of file
diff --git a/src/KubernetesClient.ModelConverter/KubernetesClient.ModelConverter.csproj b/src/KubernetesClient.ModelConverter/KubernetesClient.ModelConverter.csproj
index 569445d6f..a59add709 100644
--- a/src/KubernetesClient.ModelConverter/KubernetesClient.ModelConverter.csproj
+++ b/src/KubernetesClient.ModelConverter/KubernetesClient.ModelConverter.csproj
@@ -5,9 +5,7 @@
-
-
-
+
diff --git a/src/KubernetesClient/KubernetesClient.csproj b/src/KubernetesClient/KubernetesClient.csproj
index 78d4b413c..d9962db4e 100644
--- a/src/KubernetesClient/KubernetesClient.csproj
+++ b/src/KubernetesClient/KubernetesClient.csproj
@@ -3,6 +3,10 @@
net6.0;net7.0
k8s
+
+
+ true
@@ -75,10 +79,7 @@
-
-
-
diff --git a/src/LibKubernetesGenerator/ApiGenerator.cs b/src/LibKubernetesGenerator/ApiGenerator.cs
index e860d2cd3..53acfb047 100644
--- a/src/LibKubernetesGenerator/ApiGenerator.cs
+++ b/src/LibKubernetesGenerator/ApiGenerator.cs
@@ -8,7 +8,7 @@ namespace LibKubernetesGenerator
{
internal class ApiGenerator
{
- public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
+ public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
{
var data = swagger.Operations
.Where(o => o.Method != OpenApiOperationMethod.Options)
diff --git a/src/LibKubernetesGenerator/EmbedResource.cs b/src/LibKubernetesGenerator/EmbedResource.cs
new file mode 100644
index 000000000..85a6dda86
--- /dev/null
+++ b/src/LibKubernetesGenerator/EmbedResource.cs
@@ -0,0 +1,18 @@
+using System.IO;
+using System.Reflection;
+
+namespace LibKubernetesGenerator;
+
+internal static class EmbedResource
+{
+ public static string GetResource(string name)
+ {
+ var assembly = Assembly.GetExecutingAssembly();
+
+ var resourceName = assembly.GetName().Name + "." + name;
+
+ using var stream = assembly.GetManifestResourceStream(resourceName);
+ using var reader = new StreamReader(stream ?? throw new FileNotFoundException(resourceName));
+ return reader.ReadToEnd();
+ }
+}
diff --git a/src/LibKubernetesGenerator/GeneratorExecutionContextExt.cs b/src/LibKubernetesGenerator/GeneratorExecutionContextExt.cs
index 99bd6082f..85a097c86 100644
--- a/src/LibKubernetesGenerator/GeneratorExecutionContextExt.cs
+++ b/src/LibKubernetesGenerator/GeneratorExecutionContextExt.cs
@@ -1,17 +1,16 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using Nustache.Core;
-using System.IO;
using System.Text;
namespace LibKubernetesGenerator
{
internal static class GeneratorExecutionContextExt
{
- public static void RenderToContext(this GeneratorExecutionContext context, string templatefile, object data, string generatedfile)
+ public static void RenderToContext(this IncrementalGeneratorPostInitializationContext context, string templatefile, object data, string generatedfile)
{
- context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.projectdir", out var root);
- var generated = Render.FileToString(Path.Combine(root, "..", "LibKubernetesGenerator", "templates", templatefile), data);
+ var template = EmbedResource.GetResource(templatefile);
+ var generated = Render.StringToString(template, data);
context.AddSource(generatedfile, SourceText.From(generated, Encoding.UTF8));
}
}
diff --git a/src/LibKubernetesGenerator/KubernetesClientSourceGenerator.cs b/src/LibKubernetesGenerator/KubernetesClientSourceGenerator.cs
index 020c7725b..0e74e7f87 100644
--- a/src/LibKubernetesGenerator/KubernetesClientSourceGenerator.cs
+++ b/src/LibKubernetesGenerator/KubernetesClientSourceGenerator.cs
@@ -2,146 +2,142 @@
using Microsoft.CodeAnalysis;
using NSwag;
using Nustache.Core;
+#if GENERATE_AUTOMAPPER
using System;
-using System.Collections.Generic;
+using System.IO;
using System.Linq;
+#endif
+using System.Collections.Generic;
using System.Reflection;
namespace LibKubernetesGenerator
{
[Generator]
- public class KubernetesClientSourceGenerator : ISourceGenerator
+ public class KubernetesClientSourceGenerator : IIncrementalGenerator
{
private static readonly object Execlock = new object();
- public void ExecuteInner(GeneratorExecutionContext context)
+ private static (OpenApiDocument, IContainer) BuildContainer()
{
- lock (Execlock)
+ 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
{
- var swaggerfile = context.AdditionalFiles.First(f => f.Path.EndsWith("swagger.json"));
- var swagger = OpenApiDocument.FromJsonAsync(swaggerfile.GetText().ToString()).GetAwaiter().GetResult();
-
- context.AnalyzerConfigOptions.GetOptions(swaggerfile).TryGetValue("build_metadata.AdditionalFiles.Generator", out var generatorSetting);
- var generators = new HashSet(generatorSetting.Split(','));
-
- 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();
- 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();
- }
+ var ch = typeof(Helpers).GetField("CustomHelpers", BindingFlags.Static | BindingFlags.NonPublic);
+ ((Dictionary)ch.GetValue(null)).Clear();
+ }
- foreach (var helper in container.Resolve>())
- {
- helper.RegisterHelper();
- }
+ foreach (var helper in container.Resolve>())
+ {
+ helper.RegisterHelper();
+ }
+ return (swagger, container);
+ }
- if (generators.Contains("api"))
- {
- container.Resolve().Generate(swagger, context);
- }
+ private static IContainer BuildContainer(OpenApiDocument swagger)
+ {
+ 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();
+ builder.RegisterType();
+ builder.RegisterType();
+
+ return builder.Build();
+ }
- if (generators.Contains("model"))
+ public void Initialize(IncrementalGeneratorInitializationContext generatorContext)
+ {
+#if GENERATE_BASIC
+ generatorContext.RegisterPostInitializationOutput(ctx =>
+ {
+ lock (Execlock)
{
- container.Resolve().Generate(swagger, context);
- }
+ var (swagger, container) = BuildContainer();
- if (generators.Contains("modelext"))
- {
- container.Resolve().Generate(swagger, context);
- }
+ container.Resolve().Generate(swagger, ctx);
- if (generators.Contains("versionconverterstub"))
- {
- container.Resolve().Generate(swagger, context);
- }
+ container.Resolve().Generate(swagger, ctx);
+ container.Resolve().Generate(swagger, ctx);
+ container.Resolve().Generate(swagger, ctx);
- if (generators.Contains("versionconverterautomap"))
- {
- container.Resolve().Generate(swagger, context);
+ container.Resolve().Generate(swagger, ctx);
}
+ });
+#endif
- if (generators.Contains("version"))
+#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)
{
- container.Resolve().Generate(swagger, context);
+ var (swagger, container) = BuildContainer();
+
+ container.Resolve().Generate(swagger, ctx, srctree);
}
- }
+ });
+#endif
}
- public void Execute(GeneratorExecutionContext context)
+#if GENERATE_AUTOMAPPER
+ private IEnumerable PathSplit(string path)
{
- try
- {
- ExecuteInner(context);
- }
- catch (Exception e)
+ var p = path;
+
+ while (!string.IsNullOrEmpty(p))
{
- context.ReportDiagnostic(Diagnostic.Create(
- new DiagnosticDescriptor(
- "K8SCSG01",
- e.Message,
- e.StackTrace,
- "Kubernetes C# code generator",
- DiagnosticSeverity.Error,
- true), Location.None));
+ yield return Path.GetFileName(p);
+ p = Path.GetDirectoryName(p);
}
}
- public void Initialize(GeneratorInitializationContext context)
+ private bool PathSuffixMath(string path, string suffix)
{
-#if DEBUG
- // if (!Debugger.IsAttached)
- // {
- // Debugger.Launch();
- // }
-#endif
+ var s = PathSplit(suffix).ToList();
+ return PathSplit(path).Take(s.Count).SequenceEqual(s);
}
+#endif
}
}
diff --git a/src/LibKubernetesGenerator/LibKubernetesGenerator.csproj b/src/LibKubernetesGenerator/LibKubernetesGenerator.target
similarity index 87%
rename from src/LibKubernetesGenerator/LibKubernetesGenerator.csproj
rename to src/LibKubernetesGenerator/LibKubernetesGenerator.target
index 815969b4c..7a2d88ce5 100644
--- a/src/LibKubernetesGenerator/LibKubernetesGenerator.csproj
+++ b/src/LibKubernetesGenerator/LibKubernetesGenerator.target
@@ -1,43 +1,48 @@
-
-
- netstandard2.0
- CA1812
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(GetTargetPathDependsOn);GetDependencyTargetPaths
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ netstandard2.0
+ CA1812
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(GetTargetPathDependsOn);GetDependencyTargetPaths
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/LibKubernetesGenerator/MetaHelper.cs b/src/LibKubernetesGenerator/MetaHelper.cs
index d11cdfd79..285b62f40 100644
--- a/src/LibKubernetesGenerator/MetaHelper.cs
+++ b/src/LibKubernetesGenerator/MetaHelper.cs
@@ -27,10 +27,10 @@ public static void GetKind(RenderContext context, IList