DispatchingEntityIdParser::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Wikibase\DataModel\Entity;
4
5
use InvalidArgumentException;
6
7
/**
8
 * @since 4.2
9
 *
10
 * @license GPL-2.0-or-later
11
 * @author Jeroen De Dauw < [email protected] >
12
 */
13
class DispatchingEntityIdParser implements EntityIdParser {
14
15
	/**
16
	 * @var callable[]
17
	 */
18
	private $idBuilders;
19
20
	/**
21
	 * Takes an array in which each key is a preg_match pattern.
22
	 * The first pattern the id matches against will be picked.
23
	 * The value this key points to has to be a builder function
24
	 * that takes as only required argument the id serialization
25
	 * (string) and returns an EntityId instance.
26
	 *
27
	 * @param callable[] $idBuilders
28
	 */
29 12
	public function __construct( array $idBuilders ) {
30 12
		$this->idBuilders = $idBuilders;
31 12
	}
32
33
	/**
34
	 * @param string $idSerialization
35
	 *
36
	 * @throws EntityIdParsingException
37
	 * @return EntityId
38
	 */
39 12
	public function parse( $idSerialization ) {
40 12
		if ( $this->idBuilders === [] ) {
41
			throw new EntityIdParsingException( 'No id builders are configured' );
42 9
		}
43 1
44
		try {
45
			list( , , $localId ) = EntityId::splitSerialization( $idSerialization );
46 8
		} catch ( InvalidArgumentException $ex ) {
47 8
			// EntityId::splitSerialization performs some sanity checks which
48 4
			// might result in an exception. Should this happen, re-throw the exception message
49
			throw new EntityIdParsingException( $ex->getMessage(), 0, $ex );
50 6
		}
51
52 4
		foreach ( $this->idBuilders as $idPattern => $idBuilder ) {
53 4
			if ( preg_match( $idPattern, $localId ) ) {
54 4
				return $this->buildId( $idBuilder, $idSerialization );
55
			}
56
		}
57
58
		throw new EntityIdParsingException(
59
			"The serialization \"$idSerialization\" is not recognized by the configured id builders"
60
		);
61
	}
62 12
63 12
	/**
64 3
	 * @param callable $idBuilder
65
	 * @param string $idSerialization
66 9
	 *
67
	 * @throws EntityIdParsingException
68
	 * @return EntityId
69
	 */
70
	private function buildId( $idBuilder, $idSerialization ) {
71
		try {
72
			return call_user_func( $idBuilder, $idSerialization );
73
		} catch ( InvalidArgumentException $ex ) {
74
			// Should not happen, but if it does, re-throw the original message
75 4
			throw new EntityIdParsingException( $ex->getMessage(), 0, $ex );
76
		}
77 4
	}
78
79
}
80