< Summary

Information
Class: Orchestrator.Infrastructure.Langfuse.LangfuseJsonUtilities
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/Langfuse/LangfuseJsonUtilities.cs
Line coverage
2%
Covered lines: 1
Uncovered lines: 34
Coverable lines: 35
Total lines: 94
Line coverage: 2.8%
Branch coverage
9%
Covered branches: 2
Total branches: 21
Branch coverage: 9.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IsDefined(...)100%22100%
StableEquals(...)100%210%
ToStableJson(...)100%210%
WriteStableJson(...)0%380190%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/Langfuse/LangfuseJsonUtilities.cs

#LineLine coverage
 1using System.Buffers;
 2using System.Globalization;
 3using System.Text;
 4using System.Text.Json;
 5
 6namespace Orchestrator.Infrastructure.Langfuse;
 7
 8internal static class LangfuseJsonUtilities
 9{
 10    public static bool IsDefined(JsonElement element)
 11    {
 112        return element.ValueKind is not JsonValueKind.Undefined and not JsonValueKind.Null;
 13    }
 14
 15    public static bool StableEquals(JsonElement left, JsonElement right)
 16    {
 017        return string.Equals(ToStableJson(left), ToStableJson(right), StringComparison.Ordinal);
 18    }
 19
 20    public static string ToStableJson(JsonElement value)
 21    {
 022        var buffer = new ArrayBufferWriter<byte>();
 023        using (var writer = new Utf8JsonWriter(buffer))
 24        {
 025            WriteStableJson(writer, value);
 026        }
 27
 028        return Encoding.UTF8.GetString(buffer.WrittenSpan);
 29    }
 30
 31    private static void WriteStableJson(Utf8JsonWriter writer, JsonElement value)
 32    {
 033        switch (value.ValueKind)
 34        {
 35            case JsonValueKind.Object:
 036                writer.WriteStartObject();
 037                foreach (var property in value.EnumerateObject().OrderBy(property => property.Name, StringComparer.Ordin
 38                {
 039                    writer.WritePropertyName(property.Name);
 040                    WriteStableJson(writer, property.Value);
 41                }
 42
 043                writer.WriteEndObject();
 044                break;
 45
 46            case JsonValueKind.Array:
 047                writer.WriteStartArray();
 048                foreach (var item in value.EnumerateArray())
 49                {
 050                    WriteStableJson(writer, item);
 51                }
 52
 053                writer.WriteEndArray();
 054                break;
 55
 56            case JsonValueKind.String:
 057                writer.WriteStringValue(value.GetString());
 058                break;
 59
 60            case JsonValueKind.Number:
 061                if (value.TryGetInt64(out var int64Value))
 62                {
 063                    writer.WriteNumberValue(int64Value);
 64                }
 065                else if (value.TryGetDecimal(out var decimalValue))
 66                {
 067                    writer.WriteNumberValue(decimalValue);
 68                }
 69                else
 70                {
 071                    writer.WriteRawValue(value.GetRawText());
 72                }
 73
 074                break;
 75
 76            case JsonValueKind.True:
 077                writer.WriteBooleanValue(true);
 078                break;
 79
 80            case JsonValueKind.False:
 081                writer.WriteBooleanValue(false);
 082                break;
 83
 84            case JsonValueKind.Null:
 85            case JsonValueKind.Undefined:
 086                writer.WriteNullValue();
 087                break;
 88
 89            default:
 090                throw new InvalidOperationException(
 091                    string.Format(CultureInfo.InvariantCulture, "Unsupported JSON value kind '{0}'.", value.ValueKind));
 92        }
 93    }
 94}