-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathValidatedBuild.php
More file actions
92 lines (76 loc) · 2.67 KB
/
ValidatedBuild.php
File metadata and controls
92 lines (76 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php declare(strict_types=1);
/*
* This file is part of Polymorphine/Container package.
*
* (c) Shudd3r <q3.shudder@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Polymorphine\Container\Setup\Build;
use Polymorphine\Container\Setup\Build;
use Polymorphine\Container\Setup\Exception;
use Polymorphine\Container\Records;
use Polymorphine\Container\CompositeContainer;
use Psr\Container\ContainerInterface;
class ValidatedBuild extends Build
{
private array $reservedIds = [];
public function __construct(array $records = [], array $containers = [])
{
parent::__construct($this->validRecords($records), $this->validContainers($containers));
}
public function setRecord(string $id, Records\Record $record): void
{
$this->checkRecordId($id);
parent::setRecord($id, $record);
}
public function setContainer(string $id, ContainerInterface $container): void
{
$this->checkContainerId($id);
parent::setContainer($id, $container);
}
protected function records(): Records
{
return new Records\TrackedRecords($this->records);
}
private function checkRecordId(string $id): void
{
$separator = strpos($id, CompositeContainer::SEPARATOR);
if (!$separator) { return; }
$reserved = substr($id, 0, $separator);
if (isset($this->containers[$reserved])) {
throw Exception\IntegrityConstraintException::prefixConflict($reserved);
}
$this->reservedIds[$reserved] = true;
}
private function checkContainerId(string $id): void
{
if (strpos($id, CompositeContainer::SEPARATOR) !== false) {
throw Exception\IntegrityConstraintException::unexpectedPrefixSeparator(CompositeContainer::SEPARATOR, $id);
}
if (isset($this->reservedIds[$id])) {
throw Exception\IntegrityConstraintException::alreadyDefined($id);
}
}
private function validRecords(array $records): array
{
foreach ($records as $id => $record) {
$this->checkRecordId($id);
if (!$record instanceof Records\Record) {
throw Exception\InvalidTypeException::recordExpected($id);
}
}
return $records;
}
private function validContainers(array $containers): array
{
foreach ($containers as $id => $container) {
$this->checkContainerId($id);
if (!$container instanceof ContainerInterface) {
throw Exception\InvalidTypeException::containerExpected($id);
}
}
return $containers;
}
}