Completed
Push — master ( f2f357...ccb861 )
by
unknown
02:21
created

ItemIdSnakValue::fromSnak()   A

Complexity

Conditions 6
Paths 5

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.0444
c 0
b 0
f 0
cc 6
nc 5
nop 1
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
					&& $dataValue->getEntityId() instanceof ItemId
89
				) {
90
					return self::fromItemId( $dataValue->getEntityId() );
91
				}
92
				break;
93
			case $snak instanceof PropertySomeValueSnak:
94
				return self::someValue();
95
			case $snak instanceof PropertyNoValueSnak:
96
				return self::noValue();
97
		}
98
99
		throw new InvalidArgumentException( 'Snak must contain item ID value or be a somevalue / novalue snak' );
100
	}
101
102
	/**
103
	 * Check whether this {@link ItemIdSnakValue} contains a known value or not.
104
	 *
105
	 * @return bool
106
	 */
107
	public function isValue() {
108
		return $this->itemId !== null;
109
	}
110
111
	/**
112
	 * Check whether this {@link ItemIdSnakValue} contains an unknown value or not.
113
	 *
114
	 * @return bool
115
	 */
116
	public function isSomeValue() {
117
		return $this->some;
118
	}
119
120
	/**
121
	 * Check whether this {@link ItemIdSnakValue} contains no value or not.
122
	 *
123
	 * @return bool
124
	 */
125
	public function isNoValue() {
126
		return $this->no;
127
	}
128
129
	/**
130
	 * Get the item ID contained in this {@link ItemIdSnakValue}.
131
	 * Only valid if {@link isValue} is true.
132
	 *
133
	 * @throws DomainException if this value does not contain an item ID
134
	 * @return ItemId
135
	 */
136
	public function getItemId() {
137
		if ( ! $this->isValue() ) {
138
			throw new DomainException( 'This value does not contain an item ID.' );
139
		}
140
		return $this->itemId;
141
	}
142
143
	/**
144
	 * Check whether this value matches the given $snak
145
	 * (same kind and, if contains known value, same value).
146
	 *
147
	 * @param Snak $snak
148
	 * @return bool
149
	 */
150
	public function matchesSnak( Snak $snak ) {
151
		switch ( true ) {
152
			case $snak instanceof PropertyValueSnak:
153
				return $this->isValue() &&
154
					$snak->getDataValue() instanceof EntityIdValue &&
155
					$snak->getDataValue()->getEntityId() instanceof ItemId &&
156
					$snak->getDataValue()->getEntityId()->equals( $this->getItemId() );
157
			case $snak instanceof PropertySomeValueSnak:
158
				return $this->isSomeValue();
159
			case $snak instanceof PropertyNoValueSnak:
160
				return $this->isNoValue();
161
		}
162
	}
163
164
}
165