Completed
Pull Request — master (#49)
by Maxime
01:42
created

ChoiceEnumTrait::values()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 7
nc 2
nop 0
1
<?php
2
3
/*
4
 * This file is part of the "elao/enum" package.
5
 *
6
 * Copyright (C) Elao
7
 *
8
 * @author Elao <[email protected]>
9
 */
10
11
namespace Elao\Enum;
12
13
use Elao\Enum\Exception\LogicException;
14
15
/**
16
 * Discover readable enumerated values by returning the enumerated values as keys and their labels as values
17
 * in {@link \Elao\Enum\ChoiceEnumTrait::choices()}, replacing the need to provide both:
18
 * - {@link \Elao\Enum\ReadableEnumInterface::readables()}
19
 * - {@link \Elao\Enum\ReadableEnumInterface::values()}
20
 *
21
 * Meant to be used within a {@link \Elao\Enum\ReadableEnumInterface} implementation.
22
 */
23
trait ChoiceEnumTrait
24
{
25
    /**
26
     * @see EnumInterface::values()
27
     *
28
     * @return int[]|string[]
29
     */
30
    public static function values(): array
31
    {
32
        static::checkForChoiceEnumTraitMisuses();
33
34
        $values = array_keys(static::choices());
35
36
        if (is_a(static::class, FlaggedEnum::class, true)) {
37
            $values = array_values(array_filter($values, function ($v): bool {
38
                return 0 === ($v & $v - 1);
39
            }));
40
        }
41
42
        return $values;
43
    }
44
45
    /**
46
     * @see ReadableEnumInterface::readables()
47
     *
48
     * @return string[] labels indexed by enumerated value
49
     */
50
    public static function readables(): array
51
    {
52
        static::checkForChoiceEnumTraitMisuses();
53
54
        return static::choices();
55
    }
56
57
    /**
58
     * @return string[] The enumerated values as keys and their labels as values.
59
     */
60
    abstract protected static function choices(): array;
61
62
    /**
63
     * @internal
64
     */
65
    private static function checkForChoiceEnumTraitMisuses()
66
    {
67
        if (!is_a(static::class, ReadableEnumInterface::class, true)) {
68
            throw new LogicException(sprintf(
69
                'The "%s" trait is meant to be used by "%s" implementations, but "%s" does not implement it.',
70
                ChoiceEnumTrait::class,
71
                ReadableEnumInterface::class,
72
                static::class
73
            ));
74
        }
75
    }
76
}
77