Enum   A
last analyzed

Complexity

Total Complexity 20

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 20
lcom 1
cbo 4
dl 0
loc 122
ccs 45
cts 45
cp 1
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A randomKey() 0 6 1
A randomValue() 0 6 1
A label() 0 4 1
A labels() 0 10 2
A getLabel() 0 11 2
A is() 0 8 3
A isAny() 0 10 3
A toArray() 0 10 2
A getConstList() 0 4 1
A rule() 0 4 1
A ruleByKey() 0 4 1
1
<?php
2
3
namespace MadWeb\Enum;
4
5
use Illuminate\Container\Container;
6
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
7
use MadWeb\Enum\Rules\EnumRule;
8
use MyCLabs\Enum\Enum as MyCLabsEnum;
9
10
abstract class Enum extends MyCLabsEnum implements CastsAttributes
11
{
12
    use EnumCastable;
13
14
    /**
15
     * Default enum value.
16
     */
17
    const __default = null;
18 42
19
    /**
20 42
     * {@inheritdoc}
21 18
     */
22
    public function __construct($value = null)
23
    {
24 42
        if ($value === null) {
25 42
            $value = static::__default;
26
        }
27 3
28
        parent::__construct($value);
29 3
    }
30
31 3
    public static function randomKey(): string
32
    {
33
        $keys = self::keys();
34 3
35
        return $keys[array_rand($keys)];
36 3
    }
37
38 3
    public static function randomValue(): string
39
    {
40
        $values = self::values();
41 6
42
        return $values[array_rand($values)];
43 6
    }
44
45
    public function label(): string
46 3
    {
47
        return self::getLabel($this->getValue());
48 3
    }
49
50 3
    public static function labels(): array
51 3
    {
52
        $result = [];
53
54 3
        foreach (static::toArray() as $value) {
55
            $result[$value] = static::getLabel($value);
0 ignored issues
show
Bug introduced by
Since getLabel() is declared private, calling it with static will lead to errors in possible sub-classes. You can either use self, or increase the visibility of getLabel() to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
}

public static function getSomeVariable()
{
    return static::getTemperature();
}

}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass {
      private static function getTemperature() {
        return "-182 °C";
    }
}

print YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
    }

    public static function getSomeVariable()
    {
        return self::getTemperature();
    }
}
Loading history...
56
        }
57 9
58
        return $result;
59 9
    }
60 9
61 9
    private static function getLabel(string $value): string
62 9
    {
63 6
        $lang_key = sprintf(
64
            '%s.%s.%s',
65
            config('enum.lang_file_path'),
66 9
            static::class,
67
            $value
68
        );
69 9
70
        return Container::getInstance()->make('translator')->has($lang_key) ? __($lang_key) : $value;
71 9
    }
72 3
73
    public function is($value)
74
    {
75 9
        if (is_iterable($value)) {
76
            return $this->isAny($value);
77
        }
78 3
79
        return $this->getValue() === ($value instanceof self ? $value->getValue() : $value);
80 3
    }
81 3
82 3
    public function isAny(iterable $values)
83
    {
84
        foreach ($values as $value) {
85
            if ($this->is($value)) {
86 3
                return true;
87
            }
88
        }
89 87
90
        return false;
91 87
    }
92
93 87
    public static function toArray(bool $include_default = false): array
94 87
    {
95
        $result = parent::toArray();
96
97 87
        if (! $include_default) {
98
            unset($result['__default']);
99
        }
100
101
        return $result;
102
    }
103 6
104
    /**
105 6
     * Returns all consts (possible values) as an array according to `SplEnum` class.
106
     */
107
    public function getConstList(bool $include_default = false): array
108
    {
109
        return static::toArray($include_default);
110
    }
111
112
    /**
113 6
     * Returns the validation rule (to validate by value).
114
     *
115 6
     * @return EnumRule
116
     */
117
    public static function rule(): EnumRule
118
    {
119
        return new EnumRule(static::class, false);
120
    }
121
122
    /**
123 6
     * Returns the validation rule (to validate by key).
124
     *
125 6
     * @return EnumRule
126
     */
127
    public static function ruleByKey(): EnumRule
128
    {
129
        return new EnumRule(static::class, true);
130
    }
131
}
132