< Summary

Information
Class: Chronicis.Api.Services.ExternalLinks.MonsterCategoryStrategy
Assembly: Chronicis.Api
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ExternalLinks/MonsterCategoryStrategy.cs
Line coverage
100%
Covered lines: 47
Uncovered lines: 0
Coverable lines: 47
Total lines: 79
Line coverage: 100%
Branch coverage
100%
Covered branches: 24
Total branches: 24
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_CategoryKey()100%11100%
get_Endpoint()100%11100%
get_DisplayName()100%11100%
get_Icon()100%11100%
BuildMarkdown(...)100%11100%
BuildSubtitle(...)100%44100%
AppendTypeLine(...)100%88100%
AppendStatistics(...)100%1212100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ExternalLinks/MonsterCategoryStrategy.cs

#LineLine coverage
 1using System.Text;
 2using System.Text.Json;
 3using static Chronicis.Api.Services.ExternalLinks.Open5eJsonHelpers;
 4
 5namespace Chronicis.Api.Services.ExternalLinks;
 6
 7public sealed class MonsterCategoryStrategy : Open5eCategoryStrategyBase
 8{
 169    public override string CategoryKey => "monsters";
 410    public override string Endpoint => "creatures";
 711    public override string DisplayName => "Monster";
 212    public override string? Icon => "🐉";
 13
 14    public override string BuildMarkdown(JsonElement root, string title)
 15    {
 516        var sb = new StringBuilder();
 517        sb.AppendLine($"# {title}");
 518        sb.AppendLine();
 19
 520        AppendTypeLine(sb, root);
 521        AppendStatistics(sb, root);
 522        AppendNamedArray(sb, root, "actions", "Actions");
 523        AppendNamedArray(sb, root, "special_abilities", "Special Abilities");
 524        AppendNamedArray(sb, root, "legendary_actions", "Legendary Actions");
 25
 526        return sb.ToString().Trim();
 27    }
 28
 29    public override string BuildSubtitle(JsonElement item)
 30    {
 431        var parts = new List<string> { DisplayName };
 32
 433        var cr = GetString(item, "challenge_rating");
 434        var type = GetString(item, "type");
 435        if (!string.IsNullOrEmpty(cr))
 336            parts.Add($"CR {cr}");
 437        if (!string.IsNullOrEmpty(type))
 338            parts.Add(type);
 39
 440        return string.Join(" • ", parts);
 41    }
 42
 43    private static void AppendTypeLine(StringBuilder sb, JsonElement root)
 44    {
 545        var size = GetStringFromObject(root, "size", "name") ?? GetString(root, "size");
 546        var type = GetStringFromObject(root, "type", "name") ?? GetString(root, "type");
 547        var alignment = GetString(root, "alignment");
 548        var typeLine = string.Join(" ", new[] { size, type }.Where(s => !string.IsNullOrEmpty(s)));
 549        if (!string.IsNullOrEmpty(alignment))
 250            typeLine += $", {alignment}";
 551        if (!string.IsNullOrEmpty(typeLine))
 52        {
 453            sb.AppendLine($"*{typeLine}*");
 454            sb.AppendLine();
 55        }
 556    }
 57
 58    private static void AppendStatistics(StringBuilder sb, JsonElement root)
 59    {
 560        sb.AppendLine("## Statistics");
 561        var ac = GetString(root, "armor_class");
 562        var hp = GetString(root, "hit_points");
 563        var hitDice = GetString(root, "hit_dice");
 564        var cr = GetString(root, "challenge_rating") ?? GetString(root, "cr");
 65
 566        if (!string.IsNullOrEmpty(ac))
 367            sb.AppendLine($"**Armor Class:** {ac}");
 568        if (!string.IsNullOrEmpty(hp))
 269            sb.AppendLine($"**Hit Points:** {hp}{(!string.IsNullOrEmpty(hitDice) ? $" ({hitDice})" : "")}");
 570        if (!string.IsNullOrEmpty(cr))
 371            sb.AppendLine($"**Challenge:** {cr}");
 72
 573        var speed = GetSpeedString(root);
 574        if (!string.IsNullOrEmpty(speed))
 375            sb.AppendLine($"**Speed:** {speed}");
 76
 577        sb.AppendLine();
 578    }
 79}