< Summary

Information
Class: Services.AiAssistant.AiActionSuggestorAggregator
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/AiAssistant/AiActionSuggestorAggregator.cs
Line coverage
100%
Covered lines: 12
Uncovered lines: 0
Coverable lines: 12
Total lines: 36
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Suggest(...)100%88100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/AiAssistant/AiActionSuggestorAggregator.cs

#LineLine coverage
 1using Services.ApiServices.OpenRouterApi.Models;
 2
 3namespace Services.AiAssistant;
 4
 5/// <summary>
 6/// Агрегирует все <see cref="IAiActionSuggestor"/> и возвращает дедуплицированный список чипов.
 7/// Порядок: read-чипы первыми, nav-чипы после.
 8/// </summary>
 9public sealed class AiActionSuggestorAggregator
 10{
 11    private readonly IEnumerable<IAiActionSuggestor> _suggestors;
 12
 1013    public AiActionSuggestorAggregator(IEnumerable<IAiActionSuggestor> suggestors)
 1014        => _suggestors = suggestors;
 15
 16    public List<AiActionLinkDto> Suggest(AiSuggestionContext ctx)
 17    {
 1018        var seen  = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 1019        var read  = new List<AiActionLinkDto>();
 1020        var nav   = new List<AiActionLinkDto>();
 21
 4022        foreach (var suggestor in _suggestors)
 23        {
 5624            foreach (var link in suggestor.Suggest(ctx))
 25            {
 1826                var key = $"{link.Kind}|{link.Url}|{link.ChatMessage}";
 1827                if (!seen.Add(key)) continue;
 28
 2029                if (link.IsNav) nav.Add(link);
 1030                else            read.Add(link);
 31            }
 32        }
 33
 1034        return [.. read, .. nav];
 35    }
 36}