Completed
Push — master ( 03835b...a56aa2 )
by Emil
02:19
created

Schedule::ensureExpressionExist()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
3
namespace Glooby\TaskBundle\Annotation;
4
5
use Cron\CronExpression;
6
7
/**
8
 * @author Emil Kilhage
9
 * @Annotation
10
 */
11
class Schedule
12
{
13
    /**
14
     * @var array
15
     */
16
    private static $map = [
17
        '@yearly' => '0 0 1 1 *',
18
        '@annually' => '0 0 1 1 *',
19
        '@monthly' => '0 0 1 * *',
20
        '@weekly' => '0 0 * * 0',
21
        '@daily' => '0 0 * * *',
22
        '@hourly' => '0 * * * *',
23
        '@semi_hourly' => '*/30 * * * *',
24
        '@quarter_hourly' => '*/15 * * * *',
25
        '*' => '* * * * *',
26
    ];
27
28
    /**
29
     * @var string
30
     */
31
    public $runEvery;
32
33
    /**
34
     * @var bool
35
     */
36
    public $active = true;
37
38
    /**
39
     * @var null|int
40
     */
41
    public $timeout = 0;
42
43
    /**
44
     * @var int
45
     */
46
    public $version = 10;
47
48
    /**
49
     * @var array
50
     */
51
    public $params = [];
52
53
    /**
54
     * @param array $options
55
     * @throws \InvalidArgumentException
56
     */
57
    public function __construct(array $options)
58
    {
59
        $options = $this->setDefault($options);
60
        $options = $this->ensureExpressionExist($options);
61
        $options = $this->mapExpression($options);
62
63
        $this->populate($options);
64
65
        $this->validateExpression();
66
        $this->validateTimeout();
67
        $this->validateParams();
68
    }
69
70
    /**
71
     * @throws \InvalidArgumentException
72
     */
73
    public function validateTimeout()
74
    {
75
        if (isset($this->timeout) && !is_numeric($this->timeout)) {
76
            throw new \InvalidArgumentException('Property "timeout" must be an int');
77
        }
78
    }
79
80
    /**
81
     * @throws \InvalidArgumentException
82
     */
83
    public function validateParams():void
84
    {
85
        if (!is_array($this->params)) {
86
            throw new \InvalidArgumentException('Property "params" must be an array');
87
        }
88
    }
89
90
    /**
91
     * @throws \InvalidArgumentException
92
     */
93
    public function validateExpression()
94
    {
95
        CronExpression::factory($this->runEvery);
96
    }
97
98
    /**
99
     * @param array $options
100
     * @throws \InvalidArgumentException
101
     */
102
    public function populate(array $options)
103
    {
104
        foreach ($options as $key => $value) {
105
            if (!property_exists($this, $key)) {
106
                throw new \InvalidArgumentException(sprintf('Property "%s" does not exist', $key));
107
            }
108
109
            $this->$key = $value;
110
        }
111
    }
112
113
    /**
114
     * @param array $options
115
     * @return array
116
     */
117
    public function mapExpression(array $options)
118
    {
119
        if (isset(self::$map[$options['runEvery']])) {
120
            $options['runEvery'] = self::$map[$options['runEvery']];
121
        }
122
123
        return $options;
124
    }
125
126
    /**
127
     * @param array $options
128
     * @return array
129
     */
130
    public function setDefault(array $options)
131
    {
132
        if (isset($options['value'])) {
133
            $options['runEvery'] = $options['value'];
134
            unset($options['value']);
135
        }
136
137
        return $options;
138
    }
139
140
    /**
141
     * @param array $options
142
     * @throws \InvalidArgumentException
143
     * @return array
144
     */
145
    public function ensureExpressionExist(array $options)
146
    {
147
        if (empty($options['runEvery'])) {
148
            throw new \InvalidArgumentException('Missing property runEvery');
149
        }
150
        return $options;
151
    }
152
}
153