-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathType.php
executable file
·103 lines (88 loc) · 2.54 KB
/
Type.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
<?php
/**
* PHP Billing Library
*
* @link https://github.com/hiqdev/php-billing
* @package php-billing
* @license BSD-3-Clause
* @copyright Copyright (c) 2017-2020, HiQDev (http://hiqdev.com/)
*/
namespace hiqdev\php\billing\type;
/**
* General Type.
*
* @author Andrii Vasyliev <[email protected]>
*/
class Type implements TypeInterface
{
/**
* @var int|string|null|float The unique identifier of the type. Can be an integer or string.
* Special values:
* - `Type::ANY` indicates that the type can match any ID.
* - `Type::NONE` indicates that there is no valid ID.
*/
protected $id;
/**
* @var string|null|float The name of the type. Can be a specific name or one of the special values:
* - `Type::ANY` indicates that the type can match any name.
* - `Type::NONE` indicates that there is no valid name.
*/
protected $name;
public function __construct($id, $name = self::ANY)
{
$this->id = $id;
$this->name = $name;
}
/**
* {@inheritdoc}
*/
public function getId()
{
return $this->id;
}
/**
* {@inheritdoc}
*/
public function getName(): ?string
{
return $this->name;
}
public function hasName(): bool
{
return !empty($this->name) && $this->name !== self::ANY && $this->name !== self::NONE;
}
public function getUniqueId()
{
return $this->hasName() ? $this->name : $this->id;
}
public function equals(TypeInterface $other): bool
{
return $this->id === $other->getId() &&
$this->name === $other->getName();
}
public function matches(TypeInterface $other): bool
{
return $this->id === self::ANY || $other->getId() === self::ANY
? $this->checkMatches($this->name, $other->getName())
: $this->checkMatches($this->id, $other->getId());
}
protected function checkMatches($lhs, $rhs)
{
if ($lhs === self::NONE || $rhs === self::NONE) {
return false;
}
return (string) $lhs === (string) $rhs;
}
public function jsonSerialize(): array
{
return array_filter(get_object_vars($this));
}
public function isDefined(): bool
{
return $this->id !== null || $this->name !== null;
}
public static function anyId($name): TypeInterface
{
return new static(self::ANY, $name);
}
}