Group::start()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 2
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Valid group
4
 * User: moyo
5
 * Date: 2018/6/4
6
 * Time: 2:17 PM
7
 */
8
9
namespace Carno\Validator\Valid;
10
11
use Carno\Validator\Chips\VWaits;
12
use Carno\Validator\Exception\DuplicatedGroupException;
13
use Closure;
14
15
class Group
16
{
17
    use VWaits;
18
19
    /**
20
     * @var string
21
     */
22
    private $session = null;
23
24
    /**
25
     * @var array
26
     */
27
    private $groups = [];
28
29
    /**
30
     * @param string $name
31
     * @return bool
32
     */
33
    public function has(string $name) : bool
34
    {
35
        return isset($this->groups[$name]);
36
    }
37
38
    /**
39
     * @param string $name
40
     * @param Closure $walker
41
     */
42
    public function traversing(string $name, Closure $walker) : void
43
    {
44
        if ($group = $this->groups[$name] ?? null) {
45
            foreach ($group['fields'] as $field) {
46
                $walker($group['linked'], $field);
47
            }
48
        }
49
    }
50
51
    /**
52
     * @param string $named
53
     * @param Executor $linker
54
     */
55
    public function start(string $named, Executor $linker) : void
56
    {
57
        if (isset($this->groups[$named])) {
58
            throw new DuplicatedGroupException($named);
59
        }
60
        $this->session = $named;
61
        $this->groups[$named] = ['linked' => $linker];
62
    }
63
64
    /**
65
     * @param Rule $rule
66
     */
67
    public function attach(Rule $rule) : void
68
    {
69
        $this->session && ($this->groups[$this->session]['fields'][] = $rule->f());
70
    }
71
72
    /**
73
     */
74
    public function stop() : void
75
    {
76
        if ($this->session) {
77
            $this->waiting($this->session) && $this->resolving($this->session);
78
            $this->session = null;
79
        }
80
    }
81
}
82