forked from zircote/swagger-php
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpandEnums.php
More file actions
97 lines (79 loc) · 3.08 KB
/
ExpandEnums.php
File metadata and controls
97 lines (79 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php declare(strict_types=1);
/**
* @license Apache 2.0
*/
namespace OpenApi\Processors;
use OpenApi\Analysis;
use OpenApi\Annotations as OA;
use OpenApi\Generator;
/**
* Expands PHP enums.
*
* Determines `schema`, `enum` and `type`.
*/
class ExpandEnums implements ProcessorInterface
{
use Concerns\TypesTrait;
public function __invoke(Analysis $analysis)
{
if (!class_exists('\\ReflectionEnum')) {
return;
}
$this->expandContextEnum($analysis);
$this->expandSchemaEnum($analysis);
}
protected function expandContextEnum(Analysis $analysis): void
{
/** @var OA\Schema[] $schemas */
$schemas = $analysis->getAnnotationsOfType(OA\Schema::class, true);
foreach ($schemas as $schema) {
if ($schema->_context->is('enum')) {
$re = new \ReflectionEnum($schema->_context->fullyQualifiedName($schema->_context->enum));
$schema->schema = !Generator::isDefault($schema->schema) ? $schema->schema : $re->getShortName();
$schemaType = $schema->type;
$enumType = null;
if ($re->isBacked() && ($backingType = $re->getBackingType()) && $backingType instanceof \ReflectionNamedType) {
$enumType = $backingType->getName();
}
// no (or invalid) schema type means name
$useName = Generator::isDefault($schemaType) || ($enumType && $this->native2spec($enumType) != $schemaType);
$schema->enum = array_map(function ($case) use ($useName) {
return $useName ? $case->name : $case->getBackingValue();
}, $re->getCases());
$schema->type = $useName ? 'string' : $enumType;
$this->mapNativeType($schema, $schemaType);
}
}
}
protected function expandSchemaEnum(Analysis $analysis): void
{
/** @var OA\Schema[] $schemas */
$schemas = $analysis->getAnnotationsOfType([OA\Schema::class, OA\ServerVariable::class]);
foreach ($schemas as $schema) {
if (Generator::isDefault($schema->enum)) {
continue;
}
if (is_string($schema->enum)) {
// might be enum class-string
if (is_a($schema->enum, \UnitEnum::class, true)) {
$cases = $schema->enum::cases();
} else {
throw new \InvalidArgumentException("Unexpected enum value, requires specifying the Enum class string: $schema->enum");
}
} else {
// might be an array of \UnitEnum::class, string, int, etc...
assert(is_array($schema->enum));
$cases = $schema->enum;
}
$enums = [];
foreach ($cases as $enum) {
if (is_a($enum, \UnitEnum::class)) {
$enums[] = $enum->value ?? $enum->name;
} else {
$enums[] = $enum;
}
}
$schema->enum = $enums;
}
}
}