Skip to content

Commit 6ce20bc

Browse files
authored
Enum descriptions and deprecation support (#606)
* Fix EnumType exception message * Add description support to enum type * Add deprecation support to enum type
1 parent 1edec84 commit 6ce20bc

File tree

2 files changed

+59
-12
lines changed

2 files changed

+59
-12
lines changed

src/Mappers/Root/EnumTypeMapper.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use GraphQL\Type\Definition\Type as GraphQLType;
1111
use MyCLabs\Enum\Enum;
1212
use phpDocumentor\Reflection\DocBlock;
13+
use phpDocumentor\Reflection\DocBlockFactory;
1314
use phpDocumentor\Reflection\Type;
1415
use phpDocumentor\Reflection\Types\Object_;
1516
use ReflectionClass;
@@ -119,7 +120,35 @@ private function mapByClassName(string $enumClass): EnumType|null
119120
$reflectionEnum->isBacked() &&
120121
(string) $reflectionEnum->getBackingType() === 'string';
121122

122-
$type = new EnumType($enumClass, $typeName, $useValues);
123+
$docBlockFactory = DocBlockFactory::createInstance();
124+
125+
$enumDescription = null;
126+
$docComment = $reflectionEnum->getDocComment();
127+
if ($docComment) {
128+
$docBlock = $docBlockFactory->create($docComment);
129+
$enumDescription = $docBlock->getSummary();
130+
}
131+
132+
$enumCaseDescriptions = [];
133+
$enumCaseDeprecationReasons = [];
134+
foreach ($reflectionEnum->getCases() as $reflectionEnumCase) {
135+
$docComment = $reflectionEnumCase->getDocComment();
136+
if ($docComment) {
137+
$docBlock = $docBlockFactory->create($docComment);
138+
$enumCaseDescription = $docBlock->getSummary();
139+
140+
$enumCaseDescriptions[$reflectionEnumCase->getName()] = $enumCaseDescription;
141+
$deprecation = $docBlock->getTagsByName('deprecated')[0] ?? null;
142+
143+
if ($deprecation) {
144+
$enumCaseDeprecationReasons[$reflectionEnumCase->getName()] = (string) $deprecation;
145+
}
146+
}
147+
}
148+
149+
/** @var array<string, string> $enumCaseDescriptions */
150+
/** @var array<string, string> $enumCaseDeprecationReasons */
151+
$type = new EnumType($enumClass, $typeName, $enumDescription, $enumCaseDescriptions, $enumCaseDeprecationReasons, $useValues);
123152

124153
return $this->cacheByName[$type->name] = $this->cache[$enumClass] = $type;
125154
}

src/Types/EnumType.php

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,37 @@
1717
*/
1818
class EnumType extends BaseEnumType
1919
{
20-
/** @param class-string<UnitEnum> $enumName */
21-
public function __construct(string $enumName, string $typeName, private readonly bool $useValues = false)
22-
{
23-
$values = [];
20+
/**
21+
* @param class-string<UnitEnum> $enumName
22+
* @param array<string, string> $caseDescriptions
23+
* @param array<string, string> $caseDeprecationReasons
24+
*/
25+
public function __construct(
26+
string $enumName,
27+
string $typeName,
28+
?string $description,
29+
array $caseDescriptions,
30+
array $caseDeprecationReasons,
31+
private readonly bool $useValues = false,
32+
) {
33+
$typeValues = [];
2434
foreach ($enumName::cases() as $case) {
25-
/** @var UnitEnum $case */
26-
$values[$this->serialize($case)] = ['value' => $case];
35+
$key = $this->serialize($case);
36+
$typeValues[$key] = [
37+
'name' => $key,
38+
'value' => $case,
39+
'description' => $caseDescriptions[$case->name] ?? null,
40+
'deprecationReason' => $caseDeprecationReasons[$case->name] ?? null,
41+
];
2742
}
2843

29-
parent::__construct([
30-
'name' => $typeName,
31-
'values' => $values,
32-
]);
44+
parent::__construct(
45+
[
46+
'name' => $typeName,
47+
'values' => $typeValues,
48+
'description' => $description,
49+
]
50+
);
3351
}
3452

3553
// phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
@@ -38,7 +56,7 @@ public function __construct(string $enumName, string $typeName, private readonly
3856
public function serialize($value): string
3957
{
4058
if (! $value instanceof UnitEnum) {
41-
throw new InvalidArgumentException('Expected a Myclabs Enum instance');
59+
throw new InvalidArgumentException('Expected a UnitEnum instance');
4260
}
4361

4462
if (! $this->useValues) {

0 commit comments

Comments
 (0)