RuleValidator.php
51 lines
| 1 | <?php |
| 2 | namespace PrestoPlayer\Dice\Extra; |
| 3 | class RuleValidator { |
| 4 | private $dice; |
| 5 | |
| 6 | public function __construct(\Dice\Dice $dice) { |
| 7 | $this->dice = $dice; |
| 8 | } |
| 9 | |
| 10 | public function addRule($name, array $rule) { |
| 11 | $this->checkValidKeys($rule); |
| 12 | $this->checkBoolean($rule, 'inherit'); |
| 13 | $this->checkBoolean($rule, 'shared'); |
| 14 | $this->checkNumericArray($rule, 'constructParams'); |
| 15 | $this->checkNumericArray($rule, 'shareInstances'); |
| 16 | $this->checkNumericArray($rule, 'call'); |
| 17 | $this->dice->addRule($name, $rule); |
| 18 | } |
| 19 | |
| 20 | private function checkValidKeys($rule) { |
| 21 | $validKeys = ['call', 'shared', 'substitutions', 'instanceOf', 'inherit', 'shareInstances', 'constructParams']; |
| 22 | foreach ($rule as $name => $value) { |
| 23 | if (!in_array($name, $validKeys)) throw new \InvalidArgumentException('Invalid rule option: '. $name); |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | public function create($name, array $args = [], array $share = []) { |
| 28 | return $this->dice->create($name, $args, $share); |
| 29 | } |
| 30 | |
| 31 | public function checkBoolean($rule, $key) { |
| 32 | if (!isset($rule[$key])) return; |
| 33 | |
| 34 | if (!is_bool($rule[$key])) throw new \InvalidArgumentException('Rule option ' . $key . ' must be true or false'); |
| 35 | } |
| 36 | |
| 37 | public function checkNumericArray($rule, $key) { |
| 38 | if (!isset($rule[$key])) return; |
| 39 | |
| 40 | if (count(array_filter(array_keys($rule[$key]), 'is_string')) > 0) throw new \InvalidArgumentException('Rule option ' . $key . ' must be a seqential array not an associative array'); |
| 41 | |
| 42 | } |
| 43 | |
| 44 | public function checkAssocArray($rule, $key) { |
| 45 | if (!isset($rule[$key])) return; |
| 46 | |
| 47 | if (count(array_filter(array_keys($rule[$key]), 'is_string')) === 0) throw new \InvalidArgumentException('Rule option ' . $key . ' must be a an associative array'); |
| 48 | |
| 49 | } |
| 50 | |
| 51 | } |