Skip to content

Commit 123f6a6

Browse files
committed
[graphql] Enum support.
1 parent 1bf038c commit 123f6a6

File tree

4 files changed

+175
-1
lines changed

4 files changed

+175
-1
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
"ext-mbstring": "*",
2323
"laravel/framework": "^8.22.1",
2424
"nuwave/lighthouse": "^5.3",
25-
"lastdragon-ru/lara-asp-core": "self.version"
25+
"lastdragon-ru/lara-asp-core": "self.version",
26+
"phpdocumentor/reflection-docblock": "^5.2"
2627
},
2728
"require-dev": {
2829
"ext-pdo_sqlite": "*",

src/Helpers/EnumHelper.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace LastDragon_ru\LaraASP\GraphQL\Helpers;
4+
5+
use GraphQL\Type\Definition\EnumType;
6+
use LastDragon_ru\LaraASP\Core\Enum;
7+
use phpDocumentor\Reflection\DocBlockFactory;
8+
use ReflectionClass;
9+
use ReflectionMethod;
10+
11+
class EnumHelper extends Enum {
12+
/**
13+
* Converts {@link \LastDragon_ru\LaraASP\Core\Enum} into GraphQL enum that
14+
* can be reqistered in {@link \Nuwave\Lighthouse\Schema\TypeRegistry}.
15+
*
16+
* @see https://lighthouse-php.com/master/the-basics/types.html#enum
17+
*
18+
* @param class-string<\LastDragon_ru\LaraASP\Core\Enum> $enum
19+
*/
20+
public static function getType(string $enum, ?string $name = null): EnumType {
21+
$class = new ReflectionClass($enum);
22+
$definition = [
23+
'name' => $name ?: $class->getShortName(),
24+
'description' => static::description($class),
25+
'values' => [],
26+
];
27+
28+
$enum::lookup(static function (ReflectionMethod $method) use (&$definition): void {
29+
$definition['values'][$method->getName()] = [
30+
'value' => $method->invoke(null)->getValue(),
31+
'description' => static::description($method),
32+
];
33+
});
34+
35+
return new EnumType($definition);
36+
}
37+
38+
protected static function description(ReflectionClass|ReflectionMethod $object): ?string {
39+
return $object->getDocComment()
40+
? (string) DocBlockFactory::createInstance()->create($object)->getDescription()
41+
: null;
42+
}
43+
}

src/Helpers/EnumHelperTest.graphql

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""
2+
Summary summary summary summary summary summary.
3+
4+
Description description description description description. Description
5+
description description description description Description description
6+
description description description.
7+
8+
Description description description description description. Description
9+
description description description description Description description
10+
description description description.
11+
"""
12+
enum B {
13+
a
14+
b
15+
}
16+
17+
enum EnumHelperTest__A {
18+
a
19+
20+
"""
21+
Summary summary summary summary summary summary.
22+
23+
Description description description description description. Description
24+
description description description description Description description
25+
description description description.
26+
27+
Description description description description description. Description
28+
description description description description Description description
29+
description description description.
30+
"""
31+
b
32+
}
33+
34+
type Query {
35+
test(a: EnumHelperTest__A, b: B): ID!
36+
}

src/Helpers/EnumHelperTest.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace LastDragon_ru\LaraASP\GraphQL\Helpers;
4+
5+
use LastDragon_ru\LaraASP\Core\Enum;
6+
use LastDragon_ru\LaraASP\GraphQL\Testing\TestCase;
7+
use Nuwave\Lighthouse\Schema\TypeRegistry;
8+
9+
/**
10+
* @internal
11+
* @coversDefaultClass \LastDragon_ru\LaraASP\GraphQL\Helpers\EnumHelper
12+
*/
13+
class EnumHelperTest extends TestCase {
14+
/**
15+
* @covers ::getType
16+
*/
17+
public function testGetType(): void {
18+
$a = EnumHelper::getType(EnumHelperTest__A::class);
19+
$b = EnumHelper::getType(EnumHelperTest__B::class, 'B');
20+
$registry = $this->app->make(TypeRegistry::class);
21+
22+
$registry->register($a);
23+
$registry->register($b);
24+
25+
$expected = $this->getTestData()->content('.graphql');
26+
$actual = $this->getSchema(
27+
/** @lang GraphQL */
28+
<<<'GRAPHQL'
29+
type Query {
30+
test(a: EnumHelperTest__A, b: B): ID! @all
31+
}
32+
GRAPHQL,
33+
);
34+
35+
$this->assertEquals($expected, $actual);
36+
}
37+
}
38+
39+
// @phpcs:disable PSR1.Classes.ClassDeclaration.MultipleClasses
40+
// @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
41+
42+
/**
43+
* @internal
44+
* @noinspection PhpMultipleClassesDeclarationsInOneFile
45+
*/
46+
class EnumHelperTest__A extends Enum {
47+
public static function a(): static {
48+
return static::make(__FUNCTION__);
49+
}
50+
51+
/**
52+
* Summary summary summary summary summary summary. Summary summary summary
53+
* summary summary summary. Summary summary summary summary summary summary.
54+
* Summary summary summary summary summary summary.
55+
*
56+
* Description description description description description. Description
57+
* description description description description Description description
58+
* description description description.
59+
*
60+
* Description description description description description. Description
61+
* description description description description Description description
62+
* description description description.
63+
*/
64+
public static function b(): static {
65+
return static::make(__FUNCTION__);
66+
}
67+
}
68+
69+
/**
70+
* Summary summary summary summary summary summary. Summary summary summary
71+
* summary summary summary. Summary summary summary summary summary summary.
72+
* Summary summary summary summary summary summary.
73+
*
74+
* Description description description description description. Description
75+
* description description description description Description description
76+
* description description description.
77+
*
78+
* Description description description description description. Description
79+
* description description description description Description description
80+
* description description description.
81+
*
82+
* @internal
83+
*
84+
* @noinspection PhpMultipleClassesDeclarationsInOneFile
85+
*/
86+
class EnumHelperTest__B extends Enum {
87+
public static function a(): static {
88+
return static::make(__FUNCTION__);
89+
}
90+
91+
public static function b(): static {
92+
return static::make(__FUNCTION__);
93+
}
94+
}

0 commit comments

Comments
 (0)