-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUnmarshaller.php
More file actions
73 lines (62 loc) · 2.28 KB
/
Unmarshaller.php
File metadata and controls
73 lines (62 loc) · 2.28 KB
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
<?php
declare(strict_types=1);
namespace DCarbone\Go\JSON;
/*
Copyright 2021-2023 Daniel Carbone (daniel.p.carbone@gmail.com)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
trait Unmarshaller
{
/**s
* @param string|null $json
* @return static
* @throws \ReflectionException
*/
public static function UnmarshalGoJSON(?string $json): object
{
// construct new instance of containing class
$zs = Zero::$zeroStates->getZeroState(static::class);
if (null !== $zs) {
$inst = $zs->zeroVal();
} else {
$rc = new \ReflectionClass(static::class);
$inst = $rc->newInstanceWithoutConstructor();
}
// if null is provided, return zero val of class
if (null === $json || '' === $json) {
return $inst;
}
// at this point, we have data to be unmarshalled but we are not guaranteed to have an instance to work with
if (null === $inst) {
$rc = new \ReflectionClass(static::class);
$inst = $rc->newInstanceWithoutConstructor();
}
$decoded = json_decode($json, true);
if (JSON_ERROR_NONE !== json_last_error()) {
throw new \RuntimeException(
sprintf(
'json decode error: %s',
json_last_error_msg()
)
);
}
// otherwise, continue with unmarshalling
$fieldsDefined = defined(static::class . '::FIELDS');
$fieldDef = [];
foreach ($decoded as $field => $value) {
if ($fieldsDefined) {
$fieldDef = static::FIELDS[$field] ?? null;
}
Decoder::unmarshalField($inst, $fieldDef, $field, $value);
}
return $inst;
}
}