< Summary

Information
Class: TeleFlow.Telegram.Internal.Handlers.TelegramRouteFilterPlan
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/Internal/Handlers/TelegramRouteFilterPlan.cs
Line coverage
100%
Covered lines: 32
Uncovered lines: 0
Coverable lines: 32
Total lines: 80
Line coverage: 100%
Branch coverage
100%
Covered branches: 20
Total branches: 20
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
Create(...)100%11100%
Create(...)100%2020100%

File(s)

/_/src/TeleFlow.Framework/Internal/Handlers/TelegramRouteFilterPlan.cs

#LineLine coverage
 1namespace TeleFlow.Telegram.Internal.Handlers;
 2
 3/// <summary>
 4/// Stores route filters in the order the dispatcher actually evaluates them so handler selection does not
 5/// split built-in filters, custom filters, and role requirements on every incoming Telegram update.
 6/// </summary>
 7internal sealed class TelegramRouteFilterPlan
 8{
 19    private static readonly IReadOnlyList<TelegramFilterDescriptor> EmptyBuiltInFilters = [];
 110    private static readonly IReadOnlyList<TelegramCustomFilterCallSite> EmptyCustomFilters = [];
 111    private static readonly IReadOnlyList<TelegramRoleRequirementDescriptor> EmptyRoleRequirements = [];
 112    private static readonly TelegramRouteFilterPlan Empty = new(
 113        EmptyBuiltInFilters,
 114        EmptyCustomFilters,
 115        EmptyRoleRequirements);
 16
 17    private TelegramRouteFilterPlan(
 18        IReadOnlyList<TelegramFilterDescriptor> builtInFilters,
 19        IReadOnlyList<TelegramCustomFilterCallSite> customFilters,
 20        IReadOnlyList<TelegramRoleRequirementDescriptor> roleRequirements)
 21    {
 22        BuiltInFilters = builtInFilters;
 23        CustomFilters = customFilters;
 24        RoleRequirements = roleRequirements;
 43025    }
 26
 27    public IReadOnlyList<TelegramFilterDescriptor> BuiltInFilters { get; }
 28
 29    public IReadOnlyList<TelegramCustomFilterCallSite> CustomFilters { get; }
 30
 31    public IReadOnlyList<TelegramRoleRequirementDescriptor> RoleRequirements { get; }
 32
 33    public static TelegramRouteFilterPlan Create(TelegramRouteDescriptor route)
 34    {
 109235        ArgumentNullException.ThrowIfNull(route);
 36
 109237        return Create(route.Kind, route.Filters, route.RoleRequirements);
 38    }
 39
 40    private static TelegramRouteFilterPlan Create(
 41        TelegramHandlerKind handlerKind,
 42        IReadOnlyList<TelegramFilterDescriptor> filters,
 43        IReadOnlyList<TelegramRoleRequirementDescriptor> roleRequirements)
 44    {
 109245        ArgumentNullException.ThrowIfNull(filters);
 109246        ArgumentNullException.ThrowIfNull(roleRequirements);
 47
 109248        if (filters.Count == 0 && roleRequirements.Count == 0)
 49        {
 66350            return Empty;
 51        }
 52
 42953        List<TelegramFilterDescriptor>? builtInFilters = null;
 42954        List<TelegramCustomFilterCallSite>? customFilters = null;
 55
 210656        for (var index = 0; index < filters.Count; index++)
 57        {
 62458            var filter = filters[index];
 59
 62460            if (filter.CustomFilterType is { } customFilterType)
 61            {
 6162                customFilters ??= [];
 6163                customFilters.Add(TelegramCustomFilterCallSite.Create(
 6164                    customFilterType,
 6165                    filter.CustomFilterContextType,
 6166                    filter.CustomFilterAttribute,
 6167                    handlerKind));
 6168                continue;
 69            }
 70
 56371            builtInFilters ??= [];
 56372            builtInFilters.Add(filter);
 73        }
 74
 42975        return new TelegramRouteFilterPlan(
 42976            builtInFilters?.ToArray() ?? EmptyBuiltInFilters,
 42977            customFilters?.ToArray() ?? EmptyCustomFilters,
 42978            roleRequirements);
 79    }
 80}