Passed
Push — main ( a5f538...a74a35 )
by Fractal
03:00
created

ParamConverterHelper   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 21
dl 0
loc 49
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0
wmc 6

6 Methods

Rating   Name   Duplication   Size   Complexity  
A fromReflectionAttribute() 0 3 1
A getAttribute() 0 5 1
A mapParamConverter() 0 4 1
A fromReflectionParameter() 0 8 1
A fromReflectionAttributes() 0 7 1
A searchAttribute() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace FRZB\Component\RequestMapper\Helper;
6
7
use Fp\Collections\ArrayList;
8
use FRZB\Component\RequestMapper\Attribute\ParamConverter;
9
use JetBrains\PhpStorm\Pure;
10
11
/**
12
 * @internal
13
 */
14
final class ParamConverterHelper
15
{
16
    private const REQUEST_POSTFIXES = ['Request', 'Dto', 'DTO'];
17
18 20
    public static function getAttribute(\ReflectionParameter $parameter, array $attributes): ?ParamConverter
19
    {
20 20
        return $attributes[$parameter->getName()]
21 13
            ?? $attributes[$parameter->getType()?->/** @scrutinizer ignore-call */ getName()]
22 20
            ?? self::searchAttribute($parameter, $attributes);
23
    }
24
25 20
    #[Pure]
26
    public static function mapParamConverter(ParamConverter $paramConverter): array
27
    {
28 20
        return [$paramConverter->getParameterName() ?? $paramConverter->getParameterClass() => $paramConverter];
29
    }
30
31 20
    public static function fromReflectionAttribute(\ReflectionAttribute $attribute): ParamConverter
32
    {
33 20
        return $attribute->newInstance();
34
    }
35
36
    /** @return array<string, ParamConverter> */
37 20
    public static function fromReflectionAttributes(\ReflectionAttribute ...$attributes): array
38
    {
39 20
        return ArrayList::collect($attributes)
40 20
            ->map(static fn (\ReflectionAttribute $ra): ParamConverter => self::fromReflectionAttribute($ra))
41 20
            ->map(static fn (ParamConverter $pc): array => self::mapParamConverter($pc))
42 20
            ->reduce(static fn (array $prev, array $next) => [...$prev, ...$next])
43 20
            ->getOrElse([])
44
        ;
45
    }
46
47 7
    public static function fromReflectionParameter(\ReflectionParameter $parameter): ?ParamConverter
48
    {
49 7
        $parameterName = $parameter->getName();
50 7
        $parameterType = $parameter->getType()?->/** @scrutinizer ignore-call */ getName();
51
52
        return match (true) {
53 7
            !$parameterType, !ClassHelper::isNameContains($parameterType, ...self::REQUEST_POSTFIXES) => null,
54 7
            default => new ParamConverter(parameterClass: $parameterType, parameterName: $parameterName),
55
        };
56
    }
57
58 7
    private static function searchAttribute(\ReflectionParameter $parameter, array $attributes): ?ParamConverter
59
    {
60 7
        return ArrayList::collect($attributes)
61 7
            ->first(static fn (ParamConverter $pc): bool => $pc->equals($parameter))
62 7
            ->getOrElse(self::fromReflectionParameter($parameter))
63
        ;
64
    }
65
}
66