Completed
Push — master ( 16a7a9...394662 )
by Piotr
02:02
created

OptionsValidator::validateRequestOptions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace CrazyGoat\Octophpus\Validator;
4
5
use CrazyGoat\Octophpus\Exception\InvalidOptionValueException;
6
use CrazyGoat\Octophpus\EsiTentacles;
7
use Nunzion\Expect;
8
use Psr\Cache\CacheItemPoolInterface;
9
use Psr\Log\LoggerInterface;
10
11
class OptionsValidator implements ValidatorInterface
12
{
13
    use Camelize;
14
    /**
15
     * @var array
16
     */
17
    private $config;
18
19
    public function __construct(array $config)
20
    {
21
        $this->config = $config;
22
    }
23
24
    /**
25
     * @return bool
26
     * @throws InvalidOptionValueException
27
     * @uses validateConcurrency
28
     * @uses validateTimeout
29
     * @uses validateCachePool
30
     * @uses validateLogger
31
     * @uses validateBaseUri
32
     * @uses validateOnReject
33
     * @uses validateOnTimeout
34
     * @uses validateCachePrefix
35
     * @uses validateRequestOptions
36
     */
37
    public function validate(): bool
38
    {
39
        foreach ($this->config as $key => $value) {
40
            $function = 'validate'.$this->camlize($key);
41
            if (method_exists($this, $function)) {
42
                $this->$function($value);
43
            }
44
        }
45
46
        return true;
47
    }
48
49
    private function validateRequestOptions(array $value)
50
    {
51
        Expect::that($value)->isArray();
52
    }
53
54
    private function validateCachePrefix(string $value)
55
    {
56
        Expect::that($value)->isString();
57
    }
58
59
    private function validateConcurrency(int $value) : void
60
    {
61
        Expect::that($value)->isInt()->isGreaterThan(1);
62
    }
63
64
    private function validateTimeout(float $value) : void
65
    {
66
        Expect::that($value)->isFloat()->isGreaterThan(0);
67
    }
68
69
    private function validateCachePool(?CacheItemPoolInterface $value) : void
70
    {
71
        Expect::that($value)->isNullOrInstanceOf('Psr\Cache\CacheItemPoolInterface');
72
    }
73
74
    private function validateLogger(?LoggerInterface $value) : void
75
    {
76
        Expect::that($value)->isNullOrInstanceOf('sr\Log\LoggerInterface');
77
    }
78
79
    private function validateBaseUri(string $value) : void
80
    {
81
        Expect::that($value)->isString();
82
    }
83
84
    private function validateOnReject($value) : void
85
    {
86
        if (is_string($this->config['on_reject']) && !in_array($this->config['on_reject'], [
87
                EsiTentacles::ON_REJECT_EXCEPTION,
88
                EsiTentacles::ON_REJECT_EMPTY
89
            ])) {
90
            throw new InvalidOptionValueException(
91
                'Invalid on_reject option, valid values: '.
92
                EsiTentacles::ON_REJECT_EXCEPTION.', '.EsiTentacles::ON_REJECT_EMPTY.' or Closure'
93
            );
94
        } else {
95
            Expect::that($value)->isInstanceOf('Closure');
96
        }
97
    }
98
99
    private function validateOnTimeout(string $value) : void
100
    {
101
        Expect::that($value)->isString()->isNotEmpty();
102
        if (!in_array($value, [EsiTentacles::ON_TIMEOUT_EXCEPTION, EsiTentacles::ON_TIMEOUT_H_INCLUDE])) {
103
            throw new InvalidOptionValueException(
104
                'Invalid on_reject option, valid values: '.
105
                EsiTentacles::ON_TIMEOUT_EXCEPTION.', '.EsiTentacles::ON_TIMEOUT_H_INCLUDE
106
            );
107
        }
108
    }
109
}