< Summary

Information
Class: TeleFlow.Telegram.JsonCallbackDataSerializer
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/JsonCallbackDataSerializer.cs
Line coverage
91%
Covered lines: 42
Uncovered lines: 4
Coverable lines: 46
Total lines: 116
Line coverage: 91.3%
Branch coverage
75%
Covered branches: 15
Total branches: 20
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Serialize(...)100%44100%
Deserialize(...)50%7671.42%
TeleFlow.Telegram.Internal.ICallbackDataRouteDeserializer.TryDeserializeForRoute(...)87.5%8890.9%
DeserializeJson(...)50%22100%
UnpackForMatchedRoute(...)100%11100%

File(s)

/_/src/TeleFlow.Framework/JsonCallbackDataSerializer.cs

#LineLine coverage
 1using System.Text.Json;
 2using TeleFlow.Framework.Callbacks;
 3using TeleFlow.Telegram.Internal;
 4
 5namespace TeleFlow.Telegram;
 6
 7/// <summary>
 8/// Serializes callback payloads for typed callback handlers, using compact
 9/// <see cref="TeleFlow.Annotations.CallbackDataAttribute"/> metadata when available and JSON otherwise.
 10/// </summary>
 11public sealed class JsonCallbackDataSerializer : ICallbackDataRouteDeserializer
 12{
 13    private readonly JsonSerializerOptions _jsonSerializerOptions;
 14
 15    public JsonCallbackDataSerializer(TelegramJsonOptions jsonOptions)
 16    {
 26617        ArgumentNullException.ThrowIfNull(jsonOptions);
 26618        _jsonSerializerOptions = jsonOptions.SerializerOptions;
 26619    }
 20
 21    public string Serialize<TPayload>(TPayload payload)
 22    {
 723        ArgumentNullException.ThrowIfNull(payload);
 24
 725        var serializedPayload = CallbackDataCodec.TryGetGenerated(typeof(TPayload), out var generatedCodec)
 726            ? generatedCodec.Pack(payload!)
 727            : CallbackDataMetadata.TryCreate(typeof(TPayload), out var metadata)
 728            ? CallbackDataCodec.Pack(payload!, metadata)
 729            : JsonSerializer.Serialize(payload, _jsonSerializerOptions);
 30
 731        CallbackDataCodec.ValidateCallbackData(serializedPayload, "Serialized Telegram callback data");
 32
 633        return serializedPayload;
 34    }
 35
 36    public TPayload Deserialize<TPayload>(string serializedPayload)
 37    {
 138        ArgumentNullException.ThrowIfNull(serializedPayload);
 39
 140        if (CallbackDataCodec.TryGetGenerated(typeof(TPayload), out var generatedCodec))
 41        {
 042            return (TPayload)generatedCodec.Unpack(serializedPayload);
 43        }
 44
 145        if (CallbackDataMetadata.TryCreate(typeof(TPayload), out var metadata))
 46        {
 047            return (TPayload)CallbackDataCodec.Unpack(serializedPayload, metadata);
 48        }
 49
 150        return JsonSerializer.Deserialize<TPayload>(serializedPayload, _jsonSerializerOptions)
 151            ?? throw new JsonException("Telegram callback data deserialized to null.");
 52    }
 53
 54    bool ICallbackDataRouteDeserializer.TryDeserializeForRoute(
 55        Type payloadType,
 56        string serializedPayload,
 57        out object? payload)
 58    {
 3059        ArgumentNullException.ThrowIfNull(payloadType);
 3060        ArgumentNullException.ThrowIfNull(serializedPayload);
 61
 3062        if (CallbackDataCodec.TryGetGenerated(payloadType, out var generatedCodec))
 63        {
 264            if (!generatedCodec.MatchesSerializedPayload(serializedPayload))
 65            {
 066                payload = null;
 067                return false;
 68            }
 69
 270            payload = UnpackForMatchedRoute(
 271                payloadType,
 272                serializedPayload,
 273                generatedCodec.Unpack);
 174            return true;
 75        }
 76
 2877        if (CallbackDataMetadata.TryCreate(payloadType, out var metadata))
 78        {
 1079            if (!metadata.MatchesSerializedPayload(serializedPayload))
 80            {
 581                payload = null;
 582                return false;
 83            }
 84
 585            payload = UnpackForMatchedRoute(
 586                payloadType,
 587                serializedPayload,
 1088                value => CallbackDataCodec.Unpack(value, metadata));
 489            return true;
 90        }
 91
 1892        payload = DeserializeJson(payloadType, serializedPayload);
 493        return true;
 94    }
 95
 96    private object DeserializeJson(Type payloadType, string serializedPayload)
 97    {
 1898        return JsonSerializer.Deserialize(serializedPayload, payloadType, _jsonSerializerOptions)
 1899            ?? throw new JsonException("Telegram callback data deserialized to null.");
 100    }
 101
 102    private static object UnpackForMatchedRoute(
 103        Type payloadType,
 104        string serializedPayload,
 105        Func<string, object> unpack)
 106    {
 107        try
 108        {
 7109            return unpack(serializedPayload);
 110        }
 2111        catch (Exception exception) when (CallbackDataCodec.IsPayloadDeserializationFailure(exception))
 112        {
 2113            throw new CallbackDataRouteDeserializationException(payloadType, serializedPayload, exception);
 114        }
 5115    }
 116}