Test Failed
Pull Request — main (#64)
by Lode
03:16
created

ProfileAliasManager::__construct()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 14
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 24
rs 9.2222
1
<?php
2
3
namespace alsvanzelf\jsonapi\helpers;
4
5
use alsvanzelf\jsonapi\exceptions\InputException;
6
use alsvanzelf\jsonapi\helpers\Validator;
7
use alsvanzelf\jsonapi\interfaces\ProfileInterface;
8
use alsvanzelf\jsonapi\objects\ProfileLinkObject;
9
10
abstract class ProfileAliasManager {
11
	/** @var array */
12
	private $aliasMapping = [];
13
	/** @var array */
14
	private $keywordMapping = [];
15
	
16
	/**
17
	 * ProfileInterface
18
	 */
19
	
20
	/**
21
	 * @inheritDoc
22
	 */
23
	public function __construct(array $aliases=[]) {
24
		$officialKeywords = $this->getOfficialKeywords();
25
		if ($officialKeywords === []) {
26
			return;
27
		}
28
		
29
		$this->keywordMapping = array_combine($officialKeywords, $officialKeywords);
30
		if ($aliases === []) {
31
			return;
32
		}
33
		
34
		foreach ($aliases as $keyword => $alias) {
35
			if ($alias === $keyword) {
36
				throw new InputException('an alias should be different from its keyword');
37
			}
38
			if (in_array($keyword, $officialKeywords, $strict=true) === false) {
39
				throw new InputException('unknown keyword "'.$keyword.'" to alias');
40
			}
41
			Validator::checkMemberName($alias);
42
			
43
			$this->keywordMapping[$keyword] = $alias;
44
		}
45
		
46
		$this->aliasMapping = $aliases;
47
	}
48
	
49
	/**
50
	 * @inheritDoc
51
	 */
52
	public function getKeyword($keyword) {
53
		if (isset($this->keywordMapping[$keyword]) === false) {
54
			throw new InputException('unknown keyword "'.$keyword.'"');
55
		}
56
		
57
		return $this->keywordMapping[$keyword];
58
	}
59
	
60
	/**
61
	 * @inheritDoc
62
	 */
63
	abstract public function getOfficialKeywords();
64
	
65
	/**
66
	 * @inheritDoc
67
	 */
68
	abstract public function getOfficialLink();
69
	
70
	/**
71
	 * @inheritDoc
72
	 */
73
	public function getAliasedLink() {
74
		if ($this->aliasMapping === []) {
75
			return $this->getOfficialLink();
76
		}
77
		
78
		return new ProfileLinkObject($this->getOfficialLink(), $this->aliasMapping);
79
	}
80
}
81