< Summary

Information
Class: TeleFlow.Telegram.Internal.Handlers.TelegramStateAttributeResolver
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/Internal/Handlers/TelegramStateAttributeResolver.cs
Line coverage
81%
Covered lines: 26
Uncovered lines: 6
Coverable lines: 32
Total lines: 70
Line coverage: 81.2%
Branch coverage
71%
Covered branches: 10
Total branches: 14
Branch coverage: 71.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetStates(...)100%11100%
GetStateAttributes(...)100%22100%
ResolveState(...)60%131070%
IsGenericStateAttribute(...)100%22100%

File(s)

/_/src/TeleFlow.Framework/Internal/Handlers/TelegramStateAttributeResolver.cs

#LineLine coverage
 1using System.Reflection;
 2using TeleFlow.Annotations;
 3using TeleFlow.Framework.States;
 4
 5namespace TeleFlow.Telegram.Internal.Handlers;
 6
 7internal static class TelegramStateAttributeResolver
 8{
 9    public static IReadOnlyList<string> GetStates(MemberInfo handlerType, MethodInfo method)
 10    {
 32411        return GetStateAttributes(handlerType)
 32412            .Concat(GetStateAttributes(method))
 32413            .Select(ResolveState)
 32414            .ToArray();
 15    }
 16
 17    private static IEnumerable<Attribute> GetStateAttributes(MemberInfo member)
 18    {
 64819        return member
 64820            .GetCustomAttributes(inherit: true)
 64821            .OfType<Attribute>()
 64822            .Where(static attribute =>
 149723                attribute is StateAttribute ||
 149724                IsGenericStateAttribute(attribute.GetType()));
 25    }
 26
 27    private static string ResolveState(Attribute attribute)
 28    {
 829        if (attribute is StateAttribute stateAttribute)
 30        {
 531            return stateAttribute.State;
 32        }
 33
 334        var attributeType = attribute.GetType();
 335        if (!IsGenericStateAttribute(attributeType))
 36        {
 037            throw new InvalidOperationException(
 038                $"Unsupported Telegram state attribute '{attributeType.FullName}'.");
 39        }
 40
 341        var stateName = attributeType
 342            .GetProperty(nameof(StateAttribute<object>.StateName))!
 343            .GetValue(attribute) as string;
 44
 345        if (string.IsNullOrWhiteSpace(stateName))
 46        {
 047            throw new InvalidOperationException(
 048                $"Typed Telegram state attribute '{attributeType.FullName}' must declare a state member name.");
 49        }
 50
 351        var groupType = attributeType.GetGenericArguments()[0];
 352        var property = groupType.GetProperty(
 353            stateName,
 354            BindingFlags.Public | BindingFlags.Static);
 55
 356        if (property is null || property.PropertyType != typeof(State))
 57        {
 058            throw new InvalidOperationException(
 059                $"Typed Telegram state attribute references missing state '{groupType.FullName}.{stateName}'.");
 60        }
 61
 362        return ((State)property.GetValue(null)!).Id;
 63    }
 64
 65    private static bool IsGenericStateAttribute(Type attributeType)
 66    {
 84767        return attributeType.IsGenericType &&
 84768               attributeType.GetGenericTypeDefinition() == typeof(StateAttribute<>);
 69    }
 70}