private static string MakeFileName(FileType type, Kind kind)
        {
            switch (type)
            {
            case FileType.ModelClass:
                return(NameHelper.MakeModelClassName(kind) + ".cs");

            case FileType.GeneratorClass:
                return(NameHelper.MakeGeneratorClassName(kind) + ".cs");

            case FileType.ScaffolderClass:
                return(NameHelper.MakeScaffolderClassName(kind) + ".cs");

            case FileType.GeneratorInterface:
                return(NameHelper.MakeGeneratorInterfaceName(kind) + ".cs");

            case FileType.ScaffolderInterface:
                return(NameHelper.MakeScaffolderInterfaceName(kind) + ".cs");

            default:
                return(string.Empty + ".cs");
            }
        }
        private static string GenerateServicesClass(CodeGenerationOptions options)
        {
            Clear();
            string ns = options.RootNamespace;

            WriteUsings(options, Kind.None);
            WriteLine($"namespace {ns}");
            using (OpenBlock())
            {
                WriteLine("public static class OpenApiServices");
                using (OpenBlock())
                {
                    WriteLine("private static IServiceProvider _serviceProvider;");

                    WriteLine();
                    WriteLine("public static TService GetService<TService>()");
                    using (OpenBlock())
                    {
                        WriteLine("return ServiceProvider.GetService<TService>();");
                    }

                    WriteLine();
                    WriteLine("private static IServiceProvider ServiceProvider");
                    using (OpenBlock())
                    {
                        WriteLine("get");
                        using (OpenBlock())
                        {
                            WriteLine("if (_serviceProvider == null)");
                            using (OpenBlock())
                            {
                                WriteLine("_serviceProvider = new ServiceCollection()");
                                PushIndent();
                                WriteLine($".AddSingleton<GeneratorDependencies>()");
                                WriteLine($".AddSingleton<ScaffolderDependencies>()");
                                WriteLine($".AddSingleton<IFileWriter, FileWriter>()");
                                WriteLine($".AddSingleton<IPathHelper, PathHelper>()");
                                WriteLine($".AddSingleton<ITextProvider, TextProvider>()");
                                WriteLine($".AddSingleton<INamespaceHelper, NamespaceHelper>()");
                                WriteLine($".AddSingleton<IScaffoldingManager, ScaffoldingManager>()");
                                foreach (var kind in options.Kinds)
                                {
                                    string generatorInterface = NameHelper.MakeGeneratorInterfaceName(kind);
                                    string generatorClass     = NameHelper.MakeGeneratorClassName(kind);
                                    WriteLine($".AddSingleton<{generatorInterface}, {generatorClass}>()");
                                }
                                foreach (var kind in options.Kinds)
                                {
                                    string scaffolderInterface = NameHelper.MakeScaffolderInterfaceName(kind);
                                    string scaffolderClass     = NameHelper.MakeScaffolderClassName(kind);
                                    WriteLine($".AddSingleton<{scaffolderInterface}, {scaffolderClass}>()");
                                }
                                WriteLine(".BuildServiceProvider();");
                                PopIndent();
                            }
                            WriteLine("return _serviceProvider;");
                        }
                    }
                }
            }
            return(GetText());
        }
        private static string GenerateGeneratorClass(CodeGenerationOptions options, Kind kind)
        {
            Clear();
            string ns = NamespaceHelper.MakeNamespace(options.RootNamespace, kind);

            WriteUsings(options, kind);
            WriteLine($"namespace {ns}");
            using (OpenBlock())
            {
                string typeName     = NameHelper.MakeGeneratorClassName(kind);
                string baseTypeName = NameHelper.MakeGeneratorInterfaceName(kind);

                WriteLine($"public class {typeName} : AbstractGenerator, {baseTypeName}");
                using (OpenBlock())
                {
                    WriteLine($"public {typeName}(GeneratorDependencies dependencies) : base(dependencies)");
                    using (OpenBlock())
                    {
                    }

                    if (kind == Kind.Context || kind == Kind.Supervisor)
                    {
                        WriteLine($"public string WriteClassCode(OpenApiDocument document, string @namespace)");
                        using (OpenBlock())
                        {
                            WriteLine("Clear();");
                            WriteLine("GenerateFileHeader();");
                            WriteLine("WriteLine($\"namespace {@namespace}\");");
                            WriteLine("using (OpenBlock())");
                            using (OpenBlock())
                            {
                            }
                            WriteLine("return GetText();");
                        }
                        WriteLine();
                        WriteLine($"public string WriteInterfaceCode(OpenApiDocument document, string @namespace)");
                        using (OpenBlock())
                        {
                            WriteLine("Clear();");
                            WriteLine("GenerateFileHeader();");
                            WriteLine("WriteLine($\"namespace {@namespace}\");");
                            WriteLine("using (OpenBlock())");
                            using (OpenBlock())
                            {
                            }
                            WriteLine("return GetText();");
                        }
                    }
                    else
                    {
                        WriteLine($"public string WriteCode(OpenApiSchema schema, string name, string @namespace)");
                        using (OpenBlock())
                        {
                            WriteLine("Clear();");
                            WriteLine("GenerateFileHeader();");
                            WriteLine("WriteLine($\"namespace {@namespace}\");");
                            WriteLine("using (OpenBlock())");
                            using (OpenBlock())
                            {
                                WriteLine("");
                            }
                            WriteLine("return GetText();");
                        }
                    }
                }
            }
            return(GetText());
        }