< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetString(...)100%66100%
GetInt(...)100%88100%
GetStringFromObject(...)100%44100%
GetBool(...)100%1212100%
GetStringArray(...)100%1818100%
GetSpeedString(...)100%88100%
AppendNamedArray(...)100%1212100%
BuildAttribution(...)100%44100%

File(s)

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

#LineLine coverage
 1using System.Text;
 2using System.Text.Json;
 3
 4namespace Chronicis.Api.Services.ExternalLinks;
 5
 6/// <summary>
 7/// Shared JSON extraction helpers for Open5e data.
 8/// All methods are safe against missing/mistyped properties and return null/empty on failure.
 9/// </summary>
 10public static class Open5eJsonHelpers
 11{
 12    public static string? GetString(JsonElement element, string propertyName)
 13    {
 45714        if (element.ValueKind == JsonValueKind.Object && element.TryGetProperty(propertyName, out var value))
 15        {
 28716            return value.ValueKind == JsonValueKind.String ? value.GetString() : value.ToString();
 17        }
 17018        return null;
 19    }
 20
 21    public static int? GetInt(JsonElement element, string propertyName)
 22    {
 4823        if (element.ValueKind == JsonValueKind.Object && element.TryGetProperty(propertyName, out var value))
 24        {
 4225            if (value.ValueKind == JsonValueKind.Number && value.TryGetInt32(out var number))
 26            {
 4027                return number;
 28            }
 29        }
 830        return null;
 31    }
 32
 33    public static string? GetStringFromObject(JsonElement element, string propertyName, string childPropertyName)
 34    {
 7235        if (element.ValueKind == JsonValueKind.Object && element.TryGetProperty(propertyName, out var value))
 36        {
 5437            return GetString(value, childPropertyName);
 38        }
 1839        return null;
 40    }
 41
 42    public static bool? GetBool(JsonElement element, string propertyName)
 43    {
 5444        if (element.ValueKind == JsonValueKind.Object && element.TryGetProperty(propertyName, out var value))
 45        {
 1546            if (value.ValueKind == JsonValueKind.True)
 747                return true;
 848            if (value.ValueKind == JsonValueKind.False)
 349                return false;
 550            if (value.ValueKind == JsonValueKind.String)
 51            {
 452                var str = value.GetString()!.ToLowerInvariant();
 453                return str == "true" || str == "yes";
 54            }
 55        }
 4056        return null;
 57    }
 58
 59    public static List<string> GetStringArray(JsonElement element, string propertyName)
 60    {
 1261        var list = new List<string>();
 1262        if (element.ValueKind != JsonValueKind.Object || !element.TryGetProperty(propertyName, out var value))
 663            return list;
 64
 665        if (value.ValueKind == JsonValueKind.Array)
 66        {
 3067            foreach (var item in value.EnumerateArray())
 68            {
 1169                string? str = null;
 1170                if (item.ValueKind == JsonValueKind.String)
 71                {
 572                    str = item.GetString();
 73                }
 674                else if (item.ValueKind == JsonValueKind.Object)
 75                {
 576                    str = GetString(item, "name");
 77                }
 78
 1179                if (!string.IsNullOrWhiteSpace(str))
 80                {
 781                    list.Add(str);
 82                }
 83            }
 84        }
 285        else if (value.ValueKind == JsonValueKind.String)
 86        {
 287            var str = value.GetString();
 288            if (!string.IsNullOrWhiteSpace(str))
 89            {
 190                list.Add(str);
 91            }
 92        }
 93
 694        return list;
 95    }
 96
 97    public static string? GetSpeedString(JsonElement root)
 98    {
 999        if (root.TryGetProperty("speed", out var speed))
 100        {
 6101            if (speed.ValueKind == JsonValueKind.Object)
 102            {
 4103                var parts = new List<string>();
 20104                foreach (var prop in speed.EnumerateObject())
 105                {
 6106                    var value = prop.Value.ValueKind == JsonValueKind.String
 6107                        ? prop.Value.GetString()
 6108                        : prop.Value.ToString();
 6109                    parts.Add($"{prop.Name} {value}");
 110                }
 4111                return string.Join(", ", parts);
 112            }
 2113            return speed.ToString();
 114        }
 3115        return null;
 116    }
 117
 118    public static void AppendNamedArray(StringBuilder sb, JsonElement root, string field, string header)
 119    {
 19120        if (!root.TryGetProperty(field, out var array) || array.ValueKind != JsonValueKind.Array)
 14121            return;
 122
 5123        var items = array.EnumerateArray().ToList();
 5124        if (items.Count == 0)
 1125            return;
 126
 4127        sb.AppendLine($"## {header}");
 18128        foreach (var item in items)
 129        {
 5130            var name = GetString(item, "name");
 5131            var desc = GetString(item, "desc");
 132
 5133            if (!string.IsNullOrEmpty(name))
 134            {
 5135                sb.AppendLine($"### {name}");
 136            }
 5137            if (!string.IsNullOrEmpty(desc))
 138            {
 5139                sb.AppendLine(desc);
 140            }
 5141            sb.AppendLine();
 142        }
 4143    }
 144
 145    public static string BuildAttribution(JsonElement root)
 146    {
 16147        var docTitle = GetStringFromObject(root, "document", "name")
 16148            ?? GetString(root, "document__title")
 16149            ?? "System Reference Document 5.1";
 150
 16151        return $"Source: {docTitle}";
 152    }
 153}