Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
92.59% covered (success)
92.59%
25 / 27
77.78% covered (warning)
77.78%
7 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
EnumMetadata
92.59% covered (success)
92.59%
25 / 27
77.78% covered (warning)
77.78%
7 / 9
17.12
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDisplayName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 toClass
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getHashmap
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRequiredFields
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getOptions
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
 toScalarType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 getArrayItemType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getValueOptions
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
5
1<?php
2namespace Apie\Core\Metadata;
3
4use Apie\Core\Attributes\Description;
5use Apie\Core\Context\ApieContext;
6use Apie\Core\Context\MetadataFieldHashmap;
7use Apie\Core\Dto\ValueOption;
8use Apie\Core\Enums\ScalarType;
9use Apie\Core\Lists\StringList;
10use Apie\Core\Lists\ValueOptionList;
11use ReflectionEnum;
12use UnitEnum;
13
14class EnumMetadata implements MetadataInterface
15{
16    /**
17     * @param ReflectionEnum<UnitEnum> $enum
18     */
19    public function __construct(private ReflectionEnum $enum)
20    {
21    }
22
23    public function getDisplayName(): string
24    {
25        return $this->enum->getShortName();
26    }
27
28    /**
29     * @return ReflectionEnum<UnitEnum>
30     */
31    public function toClass(): ReflectionEnum
32    {
33        return $this->enum;
34    }
35
36    public function getHashmap(): MetadataFieldHashmap
37    {
38        return new MetadataFieldHashmap();
39    }
40
41    public function getRequiredFields(): StringList
42    {
43        return new StringList([]);
44    }
45
46    /** @return array<string|int, string|int> */
47    public function getOptions(ApieContext $apieContext, bool $runtimeFilter = false): array
48    {
49        $cases = $this->enum->getCases();
50        $result = [];
51        foreach ($cases as $case) {
52            if ($apieContext->appliesToContext($case, $runtimeFilter)) {
53                $result[$case->getName()] = $this->enum->isBacked() ? $case->getBackingValue() : $case->getName();
54            }
55        }
56        return $result;
57    }
58
59    public function toScalarType(): ScalarType
60    {
61        return $this->enum->isBacked() ? ScalarType::from((string) $this->enum->getBackingType()) : ScalarType::STRING;
62    }
63
64    public function getArrayItemType(): ?MetadataInterface
65    {
66        return null;
67    }
68
69    public function getValueOptions(ApieContext $context, bool $runtimeFilter = false): ?ValueOptionList
70    {
71        $cases = $this->enum->getCases();
72        $result = [];
73        foreach ($cases as $case) {
74            if ($context->appliesToContext($case, $runtimeFilter)) {
75                $description = null;
76                foreach ($case->getAttributes(Description::class) as $descriptionAttribute) {
77                    $descriptionInstance = $descriptionAttribute->newInstance();
78                    $description = $descriptionInstance->description;
79                }
80                $result[] = new ValueOption(
81                    $this->enum->isBacked() ? $case->getBackingValue() : $case->getName(),
82                    $case->getValue(),
83                    $description
84                );
85            }
86        }
87        return new ValueOptionList($result);
88    }
89}