File: Discovery\ComponentCollectionBuilder.cs
Web Access
Project: src\src\Components\Endpoints\src\Microsoft.AspNetCore.Components.Endpoints.csproj (Microsoft.AspNetCore.Components.Endpoints)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Microsoft.AspNetCore.Components.Discovery;
 
/// <summary>
/// Represents the list of components defined in a <see cref="ComponentApplicationBuilder"/>
/// before the configuration has finalized.
/// </summary>
internal class ComponentCollectionBuilder
{
    private readonly Dictionary<string, IReadOnlyList<ComponentBuilder>> _components = new();
 
    internal void Combine(ComponentCollectionBuilder components)
    {
        foreach (var (assembly, pageCollection) in components._components)
        {
            if (!_components.ContainsKey(assembly))
            {
                _components.Add(assembly, pageCollection);
            }
        }
    }
 
    internal void Exclude(ComponentCollectionBuilder components)
    {
        foreach (var (assembly, _) in components._components)
        {
            if (_components.ContainsKey(assembly))
            {
                _components.Remove(assembly);
            }
        }
    }
 
    internal void Remove(string name)
    {
        _components.Remove(name);
    }
 
    internal void AddFromLibraryInfo(string assemblyName, IReadOnlyList<ComponentBuilder> components)
    {
        _components.Add(assemblyName, components);
    }
 
    internal ComponentInfo[] ToComponentCollection()
    {
        var totalCount = 0;
        foreach (var value in _components.Values)
        {
            totalCount += value.Count;
        }
 
        if (totalCount == 0)
        {
            return Array.Empty<ComponentInfo>();
        }
 
        var current = 0;
        var result = new ComponentInfo[totalCount];
        foreach (var (_, components) in _components)
        {
            for (var i = 0; i < components.Count; i++, current++)
            {
                var componentType = components[i];
                result[current] = componentType.Build();
            }
        }
 
        return result;
    }
}