Passed
Push — master ( 1624f2...3d792a )
by
unknown
01:39
created

TermListDeserializer::assertAttributeIsArray()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2.0116

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 6
cts 7
cp 0.8571
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 2
crap 2.0116
1
<?php
2
3
namespace Wikibase\DataModel\Deserializers;
4
5
use Deserializers\Deserializer;
6
use Deserializers\Exceptions\DeserializationException;
7
use Deserializers\Exceptions\InvalidAttributeException;
8
use Wikibase\DataModel\Term\Term;
9
use Wikibase\DataModel\Term\TermList;
10
11
/**
12
 * Package private
13
 *
14
 * @license GPL-2.0+
15
 * @author Addshore
16
 * @author Bene* < [email protected] >
17
 */
18
class TermListDeserializer implements Deserializer {
19
20
	/**
21
	 * @var Deserializer
22
	 */
23
	private $termDeserializer;
24
25
	/**
26
	 * @param Deserializer $termDeserializer
27
	 */
28 27
	public function __construct( Deserializer $termDeserializer ) {
29 27
		$this->termDeserializer = $termDeserializer;
30 27
	}
31
32
	/**
33
	 * @see Deserializer::deserialize
34
	 *
35
	 * @param array[] $serialization
36
	 *
37
	 * @throws DeserializationException
38
	 * @return TermList
39
	 */
40 22
	public function deserialize( $serialization ) {
41 22
		if ( !is_array( $serialization ) ) {
42 1
			throw new DeserializationException( 'The term list serialization should be an array' );
43
		}
44
45 21
		return $this->getDeserialized( $serialization );
46
	}
47
48
	/**
49
	 * @param array[] $serialization
50
	 *
51
	 * @return TermList
52
	 */
53 21
	private function getDeserialized( array $serialization ) {
54 21
		$termList = new TermList();
55
56 21
		foreach ( $serialization as $requestedLanguage => $termSerialization ) {
57 15
			$this->assertAttributeIsArray( $serialization, $requestedLanguage );
58 14
			$this->assertRequestedAndActualLanguageMatch( $termSerialization, $requestedLanguage );
59
60
			/** @var Term $term */
61 12
			$term = $this->termDeserializer->deserialize( $termSerialization );
62 10
			$termList->setTerm( $term );
63
		}
64
65 16
		return $termList;
66
	}
67
68 14
	private function assertRequestedAndActualLanguageMatch(
69
		array $serialization,
70
		$requestedLanguage
71
	) {
72 14
		if ( $serialization['language'] !== $requestedLanguage ) {
73 2
			throw new DeserializationException(
74
				'Deserialization of a value of the attribute language (actual)'
75
					. ' that is not matching the language key (requested) is not supported: '
76 2
					. $serialization['language'] . ' !== ' . $requestedLanguage
77
			);
78
		}
79 12
	}
80
81 15
	private function assertAttributeIsArray( array $array, $attributeName ) {
82 15
		if ( !is_array( $array[$attributeName] ) ) {
83 1
			throw new InvalidAttributeException(
84
				$attributeName,
85 1
				$array[$attributeName],
86 1
				"The internal type of attribute '$attributeName' needs to be 'array'"
87
			);
88
		}
89 14
	}
90
91
}
92