Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
94.87% covered (success)
94.87%
37 / 39
80.00% covered (warning)
80.00%
8 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
GraphQLNode
94.87% covered (success)
94.87%
37 / 39
80.00% covered (warning)
80.00%
8 / 10
21.06
0.00% covered (danger)
0.00%
0 / 1
 addElement
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLastKey
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getFirstElement
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getLastElement
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 addSubNode
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 setParent
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 hasParent
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getParent
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getRealRoot
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 getNodesFromIterable
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
7
1<?php
2
3namespace BO\Zmsclient\GraphQL;
4
5class GraphQLNode extends GraphQLElement
6{
7    public array $propertyList = [];
8
9    public ?self $parent = null;
10
11    public function addElement(string $propertyName): self
12    {
13        $this->propertyList[] = new GraphQLElement($propertyName);
14        return $this;
15    }
16
17    protected function getLastKey(): int|string|false
18    {
19        $keys = array_keys($this->propertyList);
20        return end($keys);
21    }
22
23    public function getFirstElement(): GraphQLElement
24    {
25        $first = reset($this->propertyList);
26        if ($first === false) {
27            $first = new GraphQLNode('first');
28        }
29        return $first;
30    }
31
32    public function getLastElement(): GraphQLElement
33    {
34        $lastkey = $this->getLastKey();
35        $element = $this->propertyList[$lastkey];
36        return $element;
37    }
38
39    public function addSubNode(): self
40    {
41        $lastkey = $this->getLastKey();
42        if (false === $lastkey) {
43            // root node
44            $node = new self();
45        } else {
46            $node = new self($this->getLastElement()->getPropertyName());
47        }
48        $node->setParent($this);
49        $this->propertyList[$lastkey] = $node;
50        return $node;
51    }
52
53    public function setParent(self $parent): self
54    {
55        $this->parent = $parent;
56        return $this;
57    }
58
59    public function hasParent(): bool
60    {
61        return $this->parent instanceof self;
62    }
63
64    public function getParent(): self
65    {
66        if (!$this->parent instanceof self) {
67            throw new GraphQLException("Curly bracket match problem, too many closing brackets");
68        }
69        return $this->parent;
70    }
71
72    public function getRealRoot(): self
73    {
74        $first = $this->getFirstElement();
75        if ($first->getPropertyName() == '__root' && $first instanceof self) {
76            return $first->getRealRoot();
77        }
78        return $this;
79    }
80
81    /** @psalm-api */
82    public function getNodesFromIterable(mixed $data): array
83    {
84        $reduced = [];
85        if (is_array($data) && array_values($data) === $data) {
86            foreach ($data as $item) {
87                $reduced[] = $this->getNodesFromIterable($item);
88            }
89        } else {
90            foreach ($this->propertyList as $element) {
91                $propertyName = $element->getPropertyName();
92                if (isset($data[$propertyName])) {
93                    if ($element instanceof self) {
94                        $reduced[$propertyName] = $element->getNodesFromIterable($data[$propertyName]);
95                    } else {
96                        $reduced[$propertyName] = $data[$propertyName];
97                    }
98                }
99            }
100        }
101        return $reduced;
102    }
103}