Completed
Push — master ( f44503...1def0f )
by
unknown
06:52
created

ItemIdSnakValue::someValue()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace WikibaseQuality\ConstraintReport\ConstraintCheck;
4
5
use DomainException;
6
use InvalidArgumentException;
7
use Wikibase\DataModel\Entity\EntityIdValue;
8
use Wikibase\DataModel\Entity\ItemId;
9
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
10
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
11
use Wikibase\DataModel\Snak\PropertyValueSnak;
12
use Wikibase\DataModel\Snak\Snak;
13
14
/**
15
 * A value that can either be an item ID, some value (unknown value), or no value.
16
 *
17
 * @author Lucas Werkmeister
18
 * @license GPL-2.0-or-later
19
 */
20
class ItemIdSnakValue {
21
22
	/**
23
	 * @var ItemId|null
24
	 */
25
	private $itemId = null;
26
27
	/**
28
	 * @var bool
29
	 */
30
31
	private $some = false;
32
33
	/**
34
	 * @var bool
35
	 */
36
	private $no = false;
37
38
	private function __construct() {
39
	}
40
41
	/**
42
	 * Get an {@link ItemIdSnakValue} from the given $itemId.
43
	 *
44
	 * @param ItemId $itemId
45
	 * @return self
46
	 */
47
	public static function fromItemId( ItemId $itemId ) {
48
		$ret = new self;
49
		$ret->itemId = $itemId;
50
		return $ret;
51
	}
52
53
	/**
54
	 * Get an {@link ItemIdSnakValue} that wraps an unknown value.
55
	 *
56
	 * @return self
57
	 */
58
	public static function someValue() {
59
		$ret = new self;
60
		$ret->some = true;
61
		return $ret;
62
	}
63
64
	/**
65
	 * Get an {@link ItemIdSnakValue} that wraps no value.
66
	 *
67
	 * @return self
68
	 */
69
	public static function noValue() {
70
		$ret = new self;
71
		$ret->no = true;
72
		return $ret;
73
	}
74
75
	/**
76
	 * Get an {@link ItemIdSnakValue} that matches the given snak.
77
	 *
78
	 * @param Snak $snak
79
	 *
80
	 * @throws InvalidArgumentException
81
	 * @return self
82
	 */
83
	public static function fromSnak( Snak $snak ) {
84
		switch ( true ) {
85
			case $snak instanceof PropertyValueSnak:
86
				$dataValue = $snak->getDataValue();
87
				if ( $dataValue instanceof EntityIdValue ) {
88
					$itemId = $dataValue->getEntityId();
89
					if ( $itemId instanceof ItemId ) {
90
						return self::fromItemId( $itemId );
91
					}
92
				}
93
				break;
94
			case $snak instanceof PropertySomeValueSnak:
95
				return self::someValue();
96
			case $snak instanceof PropertyNoValueSnak:
97
				return self::noValue();
98
		}
99
100
		throw new InvalidArgumentException( 'Snak must contain item ID value or be a somevalue / novalue snak' );
101
	}
102
103
	/**
104
	 * Check whether this {@link ItemIdSnakValue} contains a known value or not.
105
	 *
106
	 * @return bool
107
	 */
108
	public function isValue() {
109
		return $this->itemId !== null;
110
	}
111
112
	/**
113
	 * Check whether this {@link ItemIdSnakValue} contains an unknown value or not.
114
	 *
115
	 * @return bool
116
	 */
117
	public function isSomeValue() {
118
		return $this->some;
119
	}
120
121
	/**
122
	 * Check whether this {@link ItemIdSnakValue} contains no value or not.
123
	 *
124
	 * @return bool
125
	 */
126
	public function isNoValue() {
127
		return $this->no;
128
	}
129
130
	/**
131
	 * Get the item ID contained in this {@link ItemIdSnakValue}.
132
	 * Only valid if {@link isValue} is true.
133
	 *
134
	 * @throws DomainException if this value does not contain an item ID
135
	 * @return ItemId
136
	 */
137
	public function getItemId() {
138
		if ( !$this->isValue() ) {
139
			throw new DomainException( 'This value does not contain an item ID.' );
140
		}
141
		return $this->itemId;
142
	}
143
144
	/**
145
	 * Check whether this value matches the given $snak
146
	 * (same kind and, if contains known value, same value).
147
	 *
148
	 * @param Snak $snak
149
	 * @return bool
150
	 */
151
	public function matchesSnak( Snak $snak ) {
152
		switch ( true ) {
153
			case $snak instanceof PropertyValueSnak:
154
				$dataValue = $snak->getDataValue();
155
				return $this->isValue() &&
156
					$dataValue instanceof EntityIdValue &&
157
					$dataValue->getEntityId() instanceof ItemId &&
158
					$dataValue->getEntityId()->equals( $this->getItemId() );
159
			case $snak instanceof PropertySomeValueSnak:
160
				return $this->isSomeValue();
161
			case $snak instanceof PropertyNoValueSnak:
162
				return $this->isNoValue();
163
		}
164
	}
165
166
}
167