Issues (158)

src/Node/QueryNode.php (1 issue)

Labels
Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Jerowork\GraphqlAttributeSchema\Node;
6
7
use Jerowork\GraphqlAttributeSchema\Node\Child\ArgNode;
8
use Jerowork\GraphqlAttributeSchema\Node\Child\ArgumentNode;
9
use Jerowork\GraphqlAttributeSchema\Node\Child\EdgeArgsNode;
10
use Jerowork\GraphqlAttributeSchema\Node\TypeReference\TypeReference;
11
use Jerowork\GraphqlAttributeSchema\Type\Loader\DeferredTypeLoader;
12
13
/**
14
 * @phpstan-import-type ArgNodePayload from ArgNode
15
 * @phpstan-import-type EdgeArgsNodePayload from EdgeArgsNode
16
 *
17
 * @phpstan-type QueryNodePayload array{
18
 *     className: class-string,
19
 *     name: string,
20
 *     description: null|string,
21
 *     argumentNodes: list<array{
22
 *          node: class-string<ArgumentNode>,
23
 *          payload: ArgNodePayload|EdgeArgsNodePayload
24
 *     }>,
25
 *     outputReference: array{
26
 *          type: class-string,
27
 *          payload: array<string, mixed>
28
 *     },
29
 *     methodName: string,
30
 *     deprecationReason: null|string,
31
 *     deferredTypeLoader: null|class-string<DeferredTypeLoader>
32
 * }
33
 *
34
 * @internal
35
 */
36
final readonly class QueryNode implements Node
0 ignored issues
show
A parse error occurred: Syntax error, unexpected T_READONLY, expecting T_CLASS on line 36 at column 6
Loading history...
37
{
38
    /**
39
     * @param class-string $className
40
     * @param list<ArgumentNode> $argumentNodes
41
     * @param null|class-string<DeferredTypeLoader> $deferredTypeLoader
42
     */
43 7
    public function __construct(
44
        public string $className,
45
        public string $name,
46
        public ?string $description,
47
        public array $argumentNodes,
48
        public TypeReference $outputReference,
49
        public string $methodName,
50
        public ?string $deprecationReason,
51
        public ?string $deferredTypeLoader,
52 7
    ) {}
53
54 1
    public function getClassName(): string
55
    {
56 1
        return $this->className;
57
    }
58
59
    /**
60
     * @return QueryNodePayload
61
     */
62 2
    public function toArray(): array
63
    {
64 2
        $argumentNodes = [];
65 2
        foreach ($this->argumentNodes as $argumentNode) {
66 2
            $argumentNodes[] = [
67 2
                'node' => $argumentNode::class,
68 2
                'payload' => $argumentNode->toArray(),
69 2
            ];
70
        }
71
72 2
        return [
73 2
            'className' => $this->className,
74 2
            'name' => $this->name,
75 2
            'description' => $this->description,
76 2
            'argumentNodes' => $argumentNodes,
77 2
            'outputReference' => [
78 2
                'type' => $this->outputReference::class,
79 2
                'payload' => $this->outputReference->toArray(),
80 2
            ],
81 2
            'methodName' => $this->methodName,
82 2
            'deprecationReason' => $this->deprecationReason,
83 2
            'deferredTypeLoader' => $this->deferredTypeLoader,
84 2
        ];
85
    }
86
87
    /**
88
     * @param QueryNodePayload $payload
89
     */
90 2
    public static function fromArray(array $payload): QueryNode
91
    {
92 2
        $argumentNodes = [];
93 2
        foreach ($payload['argumentNodes'] as $argumentNode) {
94 2
            $argumentPayload = $argumentNode['payload'];
95
96 2
            if ($argumentNode['node'] === ArgNode::class) {
97
                /** @var ArgNodePayload $argumentPayload */
98 2
                $argumentNodes[] = ArgNode::fromArray($argumentPayload);
99
            } else {
100
                /** @var EdgeArgsNodePayload $argumentPayload */
101 1
                $argumentNodes[] = EdgeArgsNode::fromArray($argumentPayload);
102
            }
103
        }
104
105
        /** @var class-string<TypeReference> $type */
106 2
        $type = $payload['outputReference']['type'];
107
108 2
        return new self(
109 2
            $payload['className'],
110 2
            $payload['name'],
111 2
            $payload['description'],
112 2
            $argumentNodes,
113 2
            $type::fromArray($payload['outputReference']['payload']),
114 2
            $payload['methodName'],
115 2
            $payload['deprecationReason'],
116 2
            $payload['deferredTypeLoader'],
117 2
        );
118
    }
119
}
120