2021-10-14 06:55:19 -07:00
|
|
|
using CaseExtensions;
|
|
|
|
|
using NJsonSchema;
|
|
|
|
|
using NSwag;
|
2024-04-15 10:43:05 -07:00
|
|
|
using Scriban.Runtime;
|
|
|
|
|
using System;
|
2022-09-28 22:34:32 +02:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2021-10-14 06:55:19 -07:00
|
|
|
|
2021-12-22 17:16:44 -08:00
|
|
|
namespace LibKubernetesGenerator
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
2024-04-15 10:43:05 -07:00
|
|
|
internal class ClassNameHelper : IScriptObjectHelper
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
|
|
|
|
private readonly Dictionary<string, string> classNameMap;
|
2021-10-20 06:53:59 -07:00
|
|
|
private readonly Dictionary<JsonSchema, string> schemaToNameMapCooked;
|
2021-10-14 06:55:19 -07:00
|
|
|
|
2021-12-22 17:16:44 -08:00
|
|
|
public ClassNameHelper(OpenApiDocument swagger)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
2021-12-22 17:16:44 -08:00
|
|
|
classNameMap = InitClassNameMap(swagger);
|
|
|
|
|
schemaToNameMapCooked = GenerateSchemaToNameMapCooked(swagger);
|
2021-10-14 06:55:19 -07:00
|
|
|
}
|
|
|
|
|
|
2024-04-15 10:43:05 -07:00
|
|
|
|
|
|
|
|
public void RegisterHelper(ScriptObject scriptObject)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
2024-04-15 10:43:05 -07:00
|
|
|
scriptObject.Import(nameof(GetClassName), new Func<JsonSchema, string>(GetClassNameForSchemaDefinition));
|
2021-10-14 06:55:19 -07:00
|
|
|
}
|
|
|
|
|
|
2021-12-22 17:16:44 -08:00
|
|
|
private static Dictionary<JsonSchema, string> GenerateSchemaToNameMapCooked(OpenApiDocument swagger)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
2021-12-22 17:16:44 -08:00
|
|
|
return swagger.Definitions.ToDictionary(x => x.Value, x => x.Key.Replace(".", "").ToPascalCase());
|
2021-10-14 06:55:19 -07:00
|
|
|
}
|
|
|
|
|
|
2021-10-20 06:53:59 -07:00
|
|
|
private Dictionary<string, string> InitClassNameMap(OpenApiDocument doc)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
|
|
|
|
var map = new Dictionary<string, string>();
|
2021-12-22 17:16:44 -08:00
|
|
|
foreach (var kv in doc.Definitions)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
2021-12-22 17:16:44 -08:00
|
|
|
var k = kv.Key;
|
|
|
|
|
var v = kv.Value;
|
2021-10-14 06:55:19 -07:00
|
|
|
if (v.ExtensionData?.TryGetValue("x-kubernetes-group-version-kind", out _) == true)
|
|
|
|
|
{
|
|
|
|
|
var groupVersionKindElements = (object[])v.ExtensionData["x-kubernetes-group-version-kind"];
|
|
|
|
|
var groupVersionKind = (Dictionary<string, object>)groupVersionKindElements[0];
|
|
|
|
|
|
|
|
|
|
var group = (string)groupVersionKind["group"];
|
|
|
|
|
var kind = (string)groupVersionKind["kind"];
|
|
|
|
|
var version = (string)groupVersionKind["version"];
|
|
|
|
|
map[$"{group}_{kind}_{version}"] = k.Replace(".", "").ToPascalCase();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-15 10:43:05 -07:00
|
|
|
private string GetClassName(Dictionary<string, object> groupVersionKind)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
|
|
|
|
var group = (string)groupVersionKind["group"];
|
|
|
|
|
var kind = (string)groupVersionKind["kind"];
|
|
|
|
|
var version = (string)groupVersionKind["version"];
|
|
|
|
|
|
|
|
|
|
return classNameMap[$"{group}_{kind}_{version}"];
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-20 06:53:59 -07:00
|
|
|
public string GetClassName(JsonSchema definition)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
|
|
|
|
var groupVersionKindElements = (object[])definition.ExtensionData["x-kubernetes-group-version-kind"];
|
|
|
|
|
var groupVersionKind = (Dictionary<string, object>)groupVersionKindElements[0];
|
|
|
|
|
|
|
|
|
|
return GetClassName(groupVersionKind);
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-20 06:53:59 -07:00
|
|
|
public string GetClassNameForSchemaDefinition(JsonSchema definition)
|
2021-10-14 06:55:19 -07:00
|
|
|
{
|
|
|
|
|
if (definition.ExtensionData != null &&
|
|
|
|
|
definition.ExtensionData.ContainsKey("x-kubernetes-group-version-kind"))
|
|
|
|
|
{
|
|
|
|
|
return GetClassName(definition);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-12-22 17:16:44 -08:00
|
|
|
return schemaToNameMapCooked[definition];
|
2021-10-14 06:55:19 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|