-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonEnumClassCodec.php
More file actions
77 lines (69 loc) · 1.92 KB
/
Copy pathJsonEnumClassCodec.php
File metadata and controls
77 lines (69 loc) · 1.92 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
74
75
76
77
<?php
declare( strict_types=1 );
/**
* @license GPL-2.0-or-later
* @file
* @ingroup Json
*/
namespace Wikimedia\JsonCodec;
use BackedEnum;
use UnitEnum;
/**
* This is a simple class codec for instances of Enum types.
* It is intended for use as a singleton helper to JsonCodec.
*
* @implements JsonClassCodec<UnitEnum>
*/
class JsonEnumClassCodec implements JsonClassCodec {
/**
* Returns a JSON array representing the contents of the given object, that
* can be deserialized with the corresponding newFromJsonArray() method,
* using a ::toJsonArray() method on the object itself.
*
* @param UnitEnum $obj An object of the type handled by this JsonClassCodec
* @return array A Json representation of the object.
*/
public function toJsonArray( $obj ): array {
// @var Enum $obj
if ( $obj instanceof BackedEnum ) {
return [ 'value' => $obj->value ];
}
return [ 'name' => $obj->name ];
}
/**
* Returns the appropriate case of the enum
* @param class-string<UnitEnum> $className
* @param array $json
* @return UnitEnum
*/
public function newFromJsonArray( string $className, array $json ) {
if ( is_a( $className, BackedEnum::class, true ) ) {
return $className::from( $json['value'] );
}
$name = $json['name'];
// In PHP >= 8.3 this is just `$className::{$name}`
// https://wiki.php.net/rfc/dynamic_class_constant_fetch
return constant( $className . "::{$name}" );
}
/**
* No type hint for this enum.
*
* @param class-string<UnitEnum> $className
* @param string $keyName
* @return null Returns null.
*/
public function jsonClassHintFor( string $className, string $keyName ) {
return null;
}
/**
* Return a singleton instance of this class codec.
* @return self a singleton instance of this class
*/
public static function getInstance(): self {
static $instance = null;
if ( $instance == null ) {
$instance = new JsonEnumClassCodec();
}
return $instance;
}
}