-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDocumentData.php
134 lines (109 loc) · 3.88 KB
/
DocumentData.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
declare(strict_types=1);
namespace Undabot\JsonApi\Implementation\Model\Document;
use Undabot\JsonApi\Definition\Model\Document\DocumentDataInterface;
use Undabot\JsonApi\Definition\Model\Resource\ResourceCollectionInterface;
use Undabot\JsonApi\Definition\Model\Resource\ResourceIdentifierCollectionInterface;
use Undabot\JsonApi\Definition\Model\Resource\ResourceIdentifierInterface;
use Undabot\JsonApi\Definition\Model\Resource\ResourceInterface;
/** @psalm-suppress UnusedClass */
class DocumentData implements DocumentDataInterface
{
private mixed $data;
public function __construct(mixed $data)
{
$this->makeSureDataIsValid($data);
$this->data = $data;
}
public function isResource(): bool
{
return $this->data instanceof ResourceInterface;
}
public function isResourceIdentifier(): bool
{
return $this->data instanceof ResourceIdentifierInterface;
}
public function isResourceCollection(): bool
{
return $this->data instanceof ResourceCollectionInterface;
}
public function isResourceIdentifierCollection(): bool
{
return $this->data instanceof ResourceIdentifierCollectionInterface;
}
public function isEmpty(): bool
{
return true === empty($this->data);
}
public function getResource(): ResourceInterface
{
$data = $this->data;
if (true !== $this->isResource()) {
throw new \DomainException('Data is not Resource');
}
/** @var ResourceInterface $data */
return $data;
}
public function getResourceCollection(): ResourceCollectionInterface
{
$data = $this->data;
if (true !== $this->isResourceCollection()) {
throw new \DomainException('Data is not Resource Collection');
}
/** @var ResourceCollectionInterface $data */
return $data;
}
public function getResourceIdentifier(): ResourceIdentifierInterface
{
$data = $this->data;
if (true !== $this->isResourceIdentifier()) {
throw new \DomainException('Data is not Resource Identifier');
}
/** @var ResourceIdentifierInterface $data */
return $data;
}
public function getResourceIdentifierCollection(): ResourceIdentifierCollectionInterface
{
$data = $this->data;
if (true !== $this->isResourceIdentifierCollection()) {
throw new \DomainException('Data is not Resource Identifier Collection');
}
/** @var ResourceIdentifierCollectionInterface $data */
return $data;
}
/**
* Primary data MUST be either:
* - a single resource object, a single resource identifier object, or null, for requests that target single resources
* - an array of resource objects, an array of resource identifier objects, or an empty [[]], for requests that target resource collections.
*
* @param mixed $data
*/
private function makeSureDataIsValid($data): void
{
// or null, for requests that target single resources
if (null === $data) {
return;
}
// or an empty [[]], for requests that target resource collections
if ([] === $data) {
return;
}
// a single resource object
if (true === ($data instanceof ResourceInterface)) {
return;
}
// a single resource identifier object
if (true === ($data instanceof ResourceIdentifierInterface)) {
return;
}
// an array of resource objects
if (true === ($data instanceof ResourceCollectionInterface)) {
return;
}
// an array of resource identifier objects
if (true === ($data instanceof ResourceIdentifierCollectionInterface)) {
return;
}
throw new \InvalidArgumentException('Invalid data provided');
}
}