< Summary

Information
Class: Chronicis.Api.Services.ExternalLinks.SpellCategoryStrategy
Assembly: Chronicis.Api
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ExternalLinks/SpellCategoryStrategy.cs
Line coverage
100%
Covered lines: 66
Uncovered lines: 0
Coverable lines: 66
Total lines: 113
Line coverage: 100%
Branch coverage
100%
Covered branches: 38
Total branches: 38
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%66100%
AppendLevelAndSchool(...)100%44100%
AppendCastingInfo(...)100%1414100%
AppendComponents(...)100%1010100%
AppendDescription(...)100%22100%
AppendHigherLevels(...)100%22100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ExternalLinks/SpellCategoryStrategy.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 SpellCategoryStrategy : Open5eCategoryStrategyBase
 8{
 1129    public override string CategoryKey => "spells";
 1210    public override string Endpoint => "spells";
 4111    public override string DisplayName => "Spell";
 312    public override string? Icon => "✨";
 13
 14    public override string BuildMarkdown(JsonElement root, string title)
 15    {
 916        var sb = new StringBuilder();
 917        sb.AppendLine($"# {title}");
 918        sb.AppendLine();
 19
 920        AppendLevelAndSchool(sb, root);
 921        AppendCastingInfo(sb, root);
 922        AppendComponents(sb, root);
 923        sb.AppendLine();
 924        AppendDescription(sb, root);
 925        AppendHigherLevels(sb, root);
 26
 927        return sb.ToString().Trim();
 28    }
 29
 30    public override string BuildSubtitle(JsonElement item)
 31    {
 3432        var parts = new List<string> { DisplayName };
 33
 3434        var level = GetInt(item, "level");
 3435        var school = GetStringFromObject(item, "school", "name");
 3436        if (level.HasValue)
 37        {
 3338            parts.Add(level == 0 ? "Cantrip" : $"Level {level}");
 39        }
 3440        if (!string.IsNullOrEmpty(school))
 41        {
 3242            parts.Add(school);
 43        }
 44
 3445        return string.Join(" • ", parts);
 46    }
 47
 48    private static void AppendLevelAndSchool(StringBuilder sb, JsonElement root)
 49    {
 950        var level = GetInt(root, "level");
 951        var school = GetStringFromObject(root, "school", "name");
 952        var levelText = level == 0 ? "Cantrip" : $"Level {level}";
 53
 954        sb.AppendLine(!string.IsNullOrEmpty(school) ? $"*{levelText} {school}*" : $"*{levelText}*");
 955        sb.AppendLine();
 956    }
 57
 58    private static void AppendCastingInfo(StringBuilder sb, JsonElement root)
 59    {
 960        var castingTime = GetString(root, "casting_time");
 961        var range = GetString(root, "range_text") ?? GetString(root, "range")?.ToString();
 962        var duration = GetString(root, "duration");
 963        var concentration = GetBool(root, "concentration");
 964        var ritual = GetBool(root, "ritual");
 65
 966        sb.AppendLine("## Casting");
 967        if (!string.IsNullOrEmpty(castingTime))
 368            sb.AppendLine($"- **Casting Time:** {castingTime}{(ritual == true ? " (ritual)" : "")}");
 969        if (!string.IsNullOrEmpty(range))
 370            sb.AppendLine($"- **Range:** {range}");
 971        if (!string.IsNullOrEmpty(duration))
 372            sb.AppendLine($"- **Duration:** {(concentration == true ? "Concentration, " : "")}{duration}");
 973    }
 74
 75    private static void AppendComponents(StringBuilder sb, JsonElement root)
 76    {
 977        var verbal = GetBool(root, "verbal");
 978        var somatic = GetBool(root, "somatic");
 979        var material = GetBool(root, "material");
 980        var materialDesc = GetString(root, "material_specified");
 81
 982        var components = new List<string>();
 983        if (verbal == true)
 184            components.Add("V");
 985        if (somatic == true)
 186            components.Add("S");
 987        if (material == true)
 288            components.Add($"M{(!string.IsNullOrEmpty(materialDesc) ? $" ({materialDesc})" : "")}");
 989        if (components.Count > 0)
 290            sb.AppendLine($"- **Components:** {string.Join(", ", components)}");
 991    }
 92
 93    private static void AppendDescription(StringBuilder sb, JsonElement root)
 94    {
 995        var desc = GetString(root, "desc");
 996        if (!string.IsNullOrEmpty(desc))
 97        {
 598            sb.AppendLine("## Description");
 599            sb.AppendLine(desc);
 5100            sb.AppendLine();
 101        }
 9102    }
 103
 104    private static void AppendHigherLevels(StringBuilder sb, JsonElement root)
 105    {
 9106        var higherLevel = GetString(root, "higher_level");
 9107        if (!string.IsNullOrEmpty(higherLevel))
 108        {
 1109            sb.AppendLine("## At Higher Levels");
 1110            sb.AppendLine(higherLevel);
 111        }
 9112    }
 113}