Completed
Pull Request — master (#36)
by Maxime
11:11
created

EnumCaster   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

Changes 0
Metric Value
wmc 6
lcom 0
cbo 4
dl 0
loc 45
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
B castEnum() 0 42 6
1
<?php
2
3
/*
4
 * This file is part of the "elao/enum" package.
5
 *
6
 * Copyright (C) 2016 Elao
7
 *
8
 * @author Elao <[email protected]>
9
 */
10
11
namespace Elao\Enum\Bridge\Symfony\VarDumper\Caster;
12
13
use Elao\Enum\EnumInterface;
14
use Elao\Enum\FlaggedEnum;
15
use Elao\Enum\ReadableEnum;
16
use Symfony\Component\VarDumper\Caster\Caster;
17
use Symfony\Component\VarDumper\Caster\ConstStub;
18
19
final class EnumCaster
20
{
21
    public static function castEnum(EnumInterface $enum, $array)
22
    {
23
        $a = [];
24
        $value = $enum->getValue();
25
26
        $r = new \ReflectionClass($enum);
27
        $constants = $r->getConstants();
28
        $rConstants = array_flip($constants);
29
30
        if (PHP_VERSION_ID >= 70100) {
31
            $constants = array_filter($constants, function (string $k) use ($r) {
32
                return $r->getReflectionConstant($k)->isPublic();
33
            }, ARRAY_FILTER_USE_KEY);
34
        }
35
36
        if ($enum instanceof FlaggedEnum) {
37
            $getFlagsConsts = function (FlaggedEnum $enum) use ($rConstants) {
38
                return implode(' | ', array_map(function (int $flag) use ($rConstants) {
39
                    return $rConstants[$flag];
40
                }, $enum->getFlags()));
41
            };
42
            $constNameStub = new ConstStub(0 === $value ? 'NONE' : $getFlagsConsts($enum), $value);
43
        } else {
44
            $constNameStub = new ConstStub(array_flip($constants)[$value], $value);
45
        }
46
47
        $a[Caster::PREFIX_VIRTUAL . '⚑ '] = $constNameStub;
48
49
        if ($enum instanceof ReadableEnum) {
50
            $a[Caster::PREFIX_VIRTUAL . 'readable'] = $enum->getReadable();
51
        }
52
53
        $a[Caster::PREFIX_PROTECTED . 'value'] = $value;
54
55
        if ($enum instanceof FlaggedEnum) {
56
            $a[Caster::PREFIX_PROTECTED . 'flags'] = array_map(function (int $flag) use ($rConstants) {
57
                return new ConstStub($flag, $rConstants[$flag]);
58
            }, $enum->getFlags());
59
        }
60
61
        return $a + $array;
62
    }
63
}
64