LegacySnakDeserializer::assertStructureIsValid()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 8
cts 8
cp 1
rs 9.8333
c 0
b 0
f 0
cc 4
nc 3
nop 1
crap 4
1
<?php
2
3
namespace Wikibase\InternalSerialization\Deserializers;
4
5
use DataValues\DataValue;
6
use DataValues\UnDeserializableValue;
7
use Deserializers\Deserializer;
8
use Deserializers\Exceptions\DeserializationException;
9
use LogicException;
10
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
11
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
12
use Wikibase\DataModel\Snak\PropertyValueSnak;
13
use Wikibase\DataModel\Snak\Snak;
14
15
/**
16
 * @license GPL-2.0-or-later
17
 * @author Jeroen De Dauw < [email protected] >
18
 */
19
class LegacySnakDeserializer implements Deserializer {
20
21
	/**
22
	 * @var Deserializer
23
	 */
24
	private $dataValueDeserializer;
25
26 16
	public function __construct( Deserializer $dataValueDeserializer ) {
27 16
		$this->dataValueDeserializer = $dataValueDeserializer;
28 16
	}
29
30
	/**
31
	 * @param array $serialization
32
	 *
33
	 * @return Snak
34
	 * @throws DeserializationException
35
	 * @throws LogicException
36
	 */
37 16
	public function deserialize( $serialization ) {
38 16
		$this->assertStructureIsValid( $serialization );
39
40 4
		switch ( $serialization[0] ) {
41 4
			case 'novalue':
42 1
				return new PropertyNoValueSnak( $serialization[1] );
43 3
			case 'somevalue':
44 1
				return new PropertySomeValueSnak( $serialization[1] );
45 2
			case 'value':
46 2
				return $this->deserializeValueSnak( $serialization );
47
				// @codeCoverageIgnoreStart
48
			default:
49
				throw new LogicException();
50
		}
51
		// @codeCoverageIgnoreEnd
52
	}
53
54 2
	private function deserializeValueSnak( array $serialization ) {
55
		try {
56 2
			$dataValue = $this->dataValueDeserializer->deserialize(
57
				array(
58 2
					'type' => $serialization[2],
59 2
					'value' => $serialization[3],
60
				)
61
			);
62 1
		} catch ( DeserializationException $ex ) {
63 1
			$dataValue = new UnDeserializableValue( $serialization[3], $serialization[2], $ex->getMessage() );
64
		}
65
66
		/**
67
		 * @var DataValue $dataValue
68
		 */
69 2
		return new PropertyValueSnak( $serialization[1], $dataValue );
70
	}
71
72 16
	private function assertStructureIsValid( $serialization ) {
73 16
		if ( !is_array( $serialization ) || $serialization === array() ) {
74 2
			throw new DeserializationException( 'Serialization should be a non-empty array' );
75
		}
76
77 14
		if ( $serialization[0] === 'value' ) {
78 5
			$this->assertIsValueSnak( $serialization );
79
		} else {
80 9
			$this->assertIsNonValueSnak( $serialization );
81
		}
82
83 7
		$this->assertIsPropertyId( $serialization[1] );
84 4
	}
85
86 5
	private function assertIsValueSnak( array $serialization ) {
87 5
		if ( count( $serialization ) != 4 ) {
88 3
			throw new DeserializationException( 'Value snaks need to have 4 elements' );
89
		}
90 2
	}
91
92 9
	private function assertIsNonValueSnak( array $serialization ) {
93 9
		if ( count( $serialization ) != 2 ) {
94 2
			throw new DeserializationException( 'Non-value snaks need to have 2 elements' );
95
		}
96
97 7
		if ( !in_array( $serialization[0], array( 'novalue', 'somevalue' ) ) ) {
98 2
			throw new DeserializationException( 'Unknown snak type' );
99
		}
100 5
	}
101
102 7
	private function assertIsPropertyId( $idSerialization ) {
103 7
		if ( !is_int( $idSerialization ) || $idSerialization < 1 ) {
104 3
			throw new DeserializationException( 'Property id needs to be an int bigger than 0' );
105
		}
106 4
	}
107
108
}
109