Completed
Pull Request — master (#3)
by
unknown
10:56
created

Enum::toSelect()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 0
cts 0
cp 0
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
namespace DavidIanBonner\Enumerated;
4
5
use Exception;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Facades\Lang;
8
use ReflectionClass;
9
10
class Enum
11
{
12
    /** @var string */
13
    private $value;
14
15
    /** @var array */
16
    private static $loaded = [];
17
18
    /** @var array */
19
    protected static $values = [];
20
21
    /**
22
     * @param string $value
23 6
     */
24
    public function __construct($value)
25 6
    {
26 3
        $this->validateValue($value);
27 3
        $this->value = $value;
28
    }
29
30
    /**
31
     * Return the enumerators values.
32
     *
33
     * @param bool $keys
34
     * @return array
35 24
     */
36
    public static function allValues($keys = false): array
37 24
    {
38
        $caller = get_called_class();
39 24
40 9
        if (!isset(static::$values[$caller])) {
41
            static::$values[$caller] = static::getDeclaredConstants();
42
        }
43 24
44
        return $keys ? static::$values[$caller] : array_values(static::$values[$caller]);
45
    }
46
47
    /**
48
     * Return a collection of the declared values.
49
     *
50
     * @param  bool $keys
51
     * @return Illuminate\Support\Collection
52 3
     */
53
    public static function collect($keys = false): Collection
54 3
    {
55
        return Collection::make(static::allValues($keys));
56
    }
57
58
    /**
59
     * Return an instance of a desired value.
60
     *
61
     * @param  string $value
62
     * @return DavidIanBonner\Enumerated\Enum
63 6
     */
64
    public static function ofType($value): self
65 6
    {
66
        $key = get_called_class() . ':' . $value;
67 6
68 6
        if (!isset(self::$loaded[$key])) {
69
            self::$loaded[$key] = new static($value);
70
        }
71
72
        // We can safely return the instance from the loaded array as
73
        // validation is carried out in the constructor and the
74
        // $loaded property is private.
75 3
76
        return self::$loaded[$key];
77
    }
78
79
    /**
80
     * Return the value.
81
     *
82
     * @return string
83 3
     */
84
    public function value(): string
85 3
    {
86
        return $this->value;
87
    }
88
89
    /**
90
     * Validate the value.
91
     *
92
     * @param  mixed $value
93
     * @throws DavidIanBonner\Enumerated\EnumNotValidException
94
     * @return void
95 12
     */
96
    public static function validateValue($value)
97 12
    {
98 6
        if (!in_array($value, static::allValues())) {
99
            throw new EnumNotValidException("The value [{$value}] is not a valid type.");
100 9
        }
101
    }
102
103
    /**
104
     * Check the value is valid and return a bool.
105
     *
106
     * @param  mixed  $value
107
     * @return bool
108 3
     */
109
    public static function isValid($value): bool
110
    {
111 3
        try {
112 3
            static::validateValue($value);
113 3
        } catch (Exception $e) {
114
            return false;
115
        }
116 3
117
        return true;
118
    }
119
120
    /**
121
     * Get the declared constants.
122
     *
123
     * @return array
124 6
     */
125
    protected static function getDeclaredConstants(): array
126 6
    {
127
        $reflection = new ReflectionClass(get_called_class());
128 6
129
        return (array) $reflection->getConstants();
130
    }
131
132
    /**
133
     * @return array
134
     */
135
    public static function toSelect(): array
136
    {
137
        return Collection::make(static::allValues())
138
            ->mapWithKeys(function ($key) {
139
                $outcome = self::ofType($key);
140
                return [$outcome->value() => $outcome->line()];
141
            })
142
            ->toArray();
143
    }
144
145
    /**
146
     * @return string
147
     */
148
    public function line(): string
149
    {
150
        return Lang::get(
151
            'app.enum.' . $this->langKey . '.' . str_replace('_', '-', $this->value())
0 ignored issues
show
Bug introduced by
The property langKey does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
152
        );
153
    }
154
}
155