private record TocItem()

in src/TemplateRefGenerator/Generators/TocGenerator.cs [13:81]


    private record TocItem(
        string Name,
        List<TocItem> Items,
        string? Href = null,
        string? DisplayName = null);

    private static string GetIndent(int indentLevel)
        => indentLevel > 0 ? string.Join("", Enumerable.Repeat("  ", indentLevel)) : "";

    public static string GenerateReferenceToc(MarkdownGenerator.GroupedTypes groupedTypes)
    {
        TocItem latestVersionToc = new("<placeholder>", new());
        foreach (var (resourceType, apiVersion) in groupedTypes.GetLatestApiVersionByType().OrderBy(x => x.Key, StringComparer.OrdinalIgnoreCase))
        {
            var parentToc = latestVersionToc;
            var segments = resourceType.Split('/').Skip(1).ToArray();
            foreach (var parentSegment in segments[0..^1])
            {
                var folderName = $"{parentSegment}/";
                if (parentToc.Items.FirstOrDefault(x => StringComparer.OrdinalIgnoreCase.Equals(x.Name, folderName)) is not {} nextParentToc)
                {
                    nextParentToc = new(folderName, new());
                    parentToc.Items.Add(nextParentToc);
                }

                parentToc = nextParentToc;
            }

            var mdPath = $"./{string.Join('/', segments)}.md".ToLowerInvariant();
            TocItem childToc = new(segments.Last(), new(), mdPath);
            parentToc.Items.Add(childToc);
        }

        TocItem apiVersionsToc = new("(Api versions)", new());
        foreach (var (apiVersion, resourceTypes) in groupedTypes.ResourceTypeByApiVersion.OrderByDescending(x => x.Key, ApiVersionComparer.Instance))
        {
            TocItem apiVersionToc = new(apiVersion, new());
            apiVersionsToc.Items.Add(apiVersionToc);

            foreach (var resourceType in resourceTypes.OrderBy(x => x, StringComparer.OrdinalIgnoreCase))
            {
                var parentToc = apiVersionToc;
                var segments = resourceType.Split('/').Skip(1).ToArray();
                foreach (var parentSegment in segments[0..^1])
                {
                    var folderName = $"{parentSegment}/";
                    if (parentToc.Items.FirstOrDefault(x => StringComparer.OrdinalIgnoreCase.Equals(x.Name, folderName)) is not {} nextParentToc)
                    {
                        nextParentToc = new(folderName, new());
                        parentToc.Items.Add(nextParentToc);
                    }

                    parentToc = nextParentToc;
                }

                var mdPath = $"./{apiVersion}/{string.Join('/', segments)}.md".ToLowerInvariant();
                TocItem childToc = new(segments.Last(), new(), mdPath);
                parentToc.Items.Add(childToc);
            }
        }

        var sb = new StringBuilder();
        foreach (var toc in latestVersionToc.Items)
        {
            Print(toc, sb, 0);
        }
        Print(apiVersionsToc, sb, 0);
        return sb.ToString();
    }