private static int MainImpl(string[] args) { if (args.Length == 0 || args.Length > 2) { ThrowUsageError(); } string api = args[0]; bool generateReport = false; string reportFile = null; if (args.Length == 2) { generateReport = true; string reportArg = args[1]; if (!reportArg.StartsWith("--report")) { ThrowUsageError(); } if (reportArg != "--report") { if (!reportArg.StartsWith("--report=")) { ThrowUsageError(); } reportFile = reportArg.Substring("--report=".Length); } } DirectoryLayout layout = api == "help" ? DirectoryLayout.ForHelpSnippets() : DirectoryLayout.ForApi(api); // Hack: the ASP.NET Core 3 snippets are in the Google.Cloud.Diagnostics.AspNetCore directory. string sourceDirectory = layout.SourceDirectory; if (sourceDirectory.EndsWith("Google.Cloud.Diagnostics.AspNetCore3")) { sourceDirectory = DirectoryLayout.ForApi("Google.Cloud.Diagnostics.AspNetCore").SourceDirectory; } string snippetsSource = Directory.GetDirectories(sourceDirectory, "*.Snippets").FirstOrDefault(); if (snippetsSource == null) { Console.WriteLine($"Unable to find snippets within API {api}. Ignoring this API."); return(0); } string output = layout.SnippetOutputDirectory; if (!Directory.Exists(output)) { Directory.CreateDirectory(output); } else { foreach (var file in Directory.GetFiles(output)) { File.Delete(file); } } var memberLookup = LoadMembersByType(layout.DocfxMetadataDirectory); Console.WriteLine($"Loaded {memberLookup.Count} types with {memberLookup.Sum(x => x.Count())} members"); List <string> errors = new List <string>(); var snippets = LoadAllSnippets(snippetsSource, api, errors); Console.WriteLine($"Loaded {snippets.Sum(x => x.Count())} snippets"); foreach (var entry in snippets) { if (entry.Key.EndsWith(".cs")) { errors.Add($"Snippet file {entry.Key} does not end with one of the accepted snippet file suffixes: {string.Join(", ", SnippetFileSuffixes)}"); continue; } string snippetFile = entry.Key + ".txt"; GenerateSnippetText(Path.Combine(output, snippetFile), entry); MapSnippetMetadataUids(entry, memberLookup[entry.Key], errors); GenerateSnippetMarkdown(Path.Combine(output, entry.Key + ".md"), snippetFile, entry); } var seeAlsos = LoadAllSeeAlsos(snippetsSource, errors); Console.WriteLine($"Loaded {seeAlsos.Sum(x => x.Count())} see-alsos"); foreach (var entry in seeAlsos) { MapSeeAlsoMetadataUids(entry, memberLookup, entry.Key, errors); GenerateSeeAlsoMarkdown(Path.Combine(output, entry.Key + ".md"), entry); } ValidateSeeAlsos(seeAlsos.SelectMany(x => x), snippets.SelectMany(x => x), errors); if (errors.Any()) { foreach (var error in errors) { Console.Error.WriteLine(error); } return(1); } if (generateReport) { using (var writer = reportFile == null ? Console.Out : File.CreateText(reportFile)) { GenerateReport(memberLookup, snippets, seeAlsos, writer); } } return(0); }