Passed
Push — master ( 37810d...c6a7a1 )
by Chris
03:03
created

NodeFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 7
dl 0
loc 62
ccs 0
cts 27
cp 0
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A createScalarOrNullNodeFromValue() 0 13 3
A createArrayNodeFromPackedArray() 0 9 2
A createObjectNodeFromStdClass() 0 9 2
1
<?php declare(strict_types=1);
2
3
namespace DaveRandom\Jom;
4
5
use DaveRandom\Jom\Exceptions\InvalidNodeValueException;
6
use DaveRandom\Jom\Exceptions\InvalidSubjectNodeException;
7
use DaveRandom\Jom\Exceptions\WriteOperationForbiddenException;
8
9
abstract class NodeFactory
10
{
11
    private const SCALAR_VALUE_NODE_CLASSES = [
12
        'boolean' => BooleanNode::class,
13
        'integer' => NumberNode::class,
14
        'double' => NumberNode::class,
15
        'string' => StringNode::class,
16
    ];
17
18
    /**
19
     * @throws WriteOperationForbiddenException
20
     * @throws InvalidNodeValueException
21
     * @throws InvalidSubjectNodeException
22
     */
23
    final protected function createArrayNodeFromPackedArray(Document $doc, array $values): ArrayNode
24
    {
25
        $node = new ArrayNode($doc);
26
27
        foreach ($values as $value) {
28
            $node->push($this->createNodeFromValue($doc, $value));
29
        }
30
31
        return $node;
32
    }
33
34
    /**
35
     * @throws WriteOperationForbiddenException
36
     * @throws InvalidNodeValueException
37
     * @throws InvalidSubjectNodeException
38
     */
39
    final protected function createObjectNodeFromStdClass(Document $doc, \stdClass $values): ObjectNode
40
    {
41
        $node = new ObjectNode($doc);
42
43
        foreach ($values as $key => $value) {
44
            $node->setProperty($key, $this->createNodeFromValue($doc, $value));
45
        }
46
47
        return $node;
48
    }
49
50
    final protected function createScalarOrNullNodeFromValue(Document $doc, $value): ?Node
51
    {
52
        if ($value === null) {
53
            return new NullNode($doc);
54
        }
55
56
        $className = self::SCALAR_VALUE_NODE_CLASSES[\gettype($value)] ?? null;
57
58
        if ($className !== null) {
59
            return new $className($doc, $value);
60
        }
61
62
        return null;
63
    }
64
65
    /**
66
     * @throws WriteOperationForbiddenException
67
     * @throws InvalidNodeValueException
68
     * @throws InvalidSubjectNodeException
69
     */
70
    abstract public function createNodeFromValue(Document $doc, $value): Node;
71
}
72