< Summary

Information
Class: NexusLabs.Needlr.Injection.TypeFilterers.TypeFilterDecorator
Assembly: NexusLabs.Needlr.Injection
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Injection/TypeFilterers/TypeFilterDecorator.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 64
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
IsInjectableScopedType(...)100%11100%
IsInjectableTransientType(...)100%11100%
IsInjectableSingletonType(...)100%11100%
IsTypeExcluded(...)100%44100%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Injection/TypeFilterers/TypeFilterDecorator.cs

#LineLine coverage
 1namespace NexusLabs.Needlr.Injection.TypeFilterers;
 2
 3/// <summary>
 4/// A decorator that wraps an <see cref="ITypeFilterer"/> and modifies its filtering behavior.
 5/// Allows customization of lifetime categorization without replacing the entire filterer.
 6/// </summary>
 7public sealed class TypeFilterDecorator : ITypeFilterer
 8{
 9    private readonly ITypeFilterer _innerFilterer;
 10    private readonly Func<Predicate<Type>, Type, bool> _scopedTypeFilterer;
 11    private readonly Func<Predicate<Type>, Type, bool> _transientTypeFilter;
 12    private readonly Func<Predicate<Type>, Type, bool> _singletonTypeFilter;
 13    private readonly Predicate<Type>? _exclusionPredicate;
 14
 7515    public TypeFilterDecorator(
 7516        ITypeFilterer innerFilterer,
 7517        Func<Predicate<Type>, Type, bool> scopedTypeFilterer,
 7518        Func<Predicate<Type>, Type, bool> transientTypeFilterer,
 7519        Func<Predicate<Type>, Type, bool> singletonTypeFilter,
 7520        Predicate<Type>? exclusionPredicate = null)
 21    {
 7522        ArgumentNullException.ThrowIfNull(innerFilterer);
 7523        ArgumentNullException.ThrowIfNull(scopedTypeFilterer);
 7524        ArgumentNullException.ThrowIfNull(transientTypeFilterer);
 7525        ArgumentNullException.ThrowIfNull(singletonTypeFilter);
 26
 7527        _innerFilterer = innerFilterer;
 7528        _scopedTypeFilterer = scopedTypeFilterer;
 7529        _transientTypeFilter = transientTypeFilterer;
 7530        _singletonTypeFilter = singletonTypeFilter;
 7531        _exclusionPredicate = exclusionPredicate;
 7532    }
 33
 34    /// <inheritdoc />
 35    public bool IsInjectableScopedType(Type type)
 446136        => _scopedTypeFilterer.Invoke(
 446137            _innerFilterer.IsInjectableScopedType,
 446138            type);
 39
 40    /// <inheritdoc />
 41    public bool IsInjectableTransientType(Type type)
 451542        => _transientTypeFilter.Invoke(
 451543            _innerFilterer.IsInjectableTransientType,
 451544            type);
 45
 46    /// <inheritdoc />
 47    public bool IsInjectableSingletonType(Type type)
 694048        => _singletonTypeFilter.Invoke(
 694049            _innerFilterer.IsInjectableSingletonType,
 694050            type);
 51
 52    /// <inheritdoc />
 53    public bool IsTypeExcluded(Type type)
 54    {
 55        // Check our exclusion predicate first
 689856        if (_exclusionPredicate?.Invoke(type) == true)
 57        {
 5058            return true;
 59        }
 60
 61        // Delegate to inner filterer
 684862        return _innerFilterer.IsTypeExcluded(type);
 63    }
 64}