Configuration   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 4
dl 0
loc 141
ccs 66
cts 66
cp 1
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getSourceFactory() 0 4 1
A getNamerFactory() 0 4 1
A getDestinationFactory() 0 4 1
A getProcessorFactory() 0 4 1
A getConfigTreeBuilder() 0 49 1
A addFactories() 0 23 2
1
<?php
2
3
namespace Zenstruck\BackupBundle\DependencyInjection;
4
5
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
7
use Symfony\Component\Config\Definition\ConfigurationInterface;
8
use Zenstruck\BackupBundle\DependencyInjection\Factory\Factory;
9
10
/**
11
 * @author Kevin Bond <[email protected]>
12
 */
13
class Configuration implements ConfigurationInterface
14
{
15
    private $namerFactories;
16
    private $processorFactories;
17
    private $sourceFactories;
18
    private $destinationFactories;
19
20
    /**
21
     * @param Factory[] $namerFactories
22
     * @param Factory[] $processorFactories
23
     * @param Factory[] $sourceFactories
24
     * @param Factory[] $destinationFactories
25
     */
26 5
    public function __construct(array $namerFactories, array $processorFactories, array $sourceFactories, array $destinationFactories)
27
    {
28 5
        $this->namerFactories = $namerFactories;
29 5
        $this->processorFactories = $processorFactories;
30 5
        $this->sourceFactories = $sourceFactories;
31 5
        $this->destinationFactories = $destinationFactories;
32 5
    }
33
34 5
    public function getConfigTreeBuilder()
35
    {
36 5
        $treeBuilder = new TreeBuilder();
37 5
        $rootNode = $treeBuilder->root('zenstruck_backup');
38
39 5
        $this->addFactories($rootNode, 'namers', 'namer', $this->namerFactories);
40 5
        $this->addFactories($rootNode, 'processors', 'processor', $this->processorFactories);
41 5
        $this->addFactories($rootNode, 'sources', 'source', $this->sourceFactories);
42 5
        $this->addFactories($rootNode, 'destinations', 'destination', $this->destinationFactories);
43
44
        $rootNode
45 5
            ->children()
46 5
                ->arrayNode('profiles')
47 5
                    ->useAttributeAsKey('name')
48 5
                    ->prototype('array')
49 5
                        ->children()
50 5
                            ->scalarNode('scratch_dir')->defaultValue('%kernel.cache_dir%/backup')->end()
51 5
                            ->arrayNode('sources')
52 5
                                ->isRequired()
53 5
                                ->requiresAtLeastOneElement()
54 5
                                ->prototype('scalar')->end()
55 5
                                ->beforeNormalization()
56 5
                                    ->ifString()
57 5
                                    ->then(function ($v) {
58 1
                                        return array($v);
59 5
                                    })
60 5
                                ->end()
61 5
                            ->end()
62 5
                            ->scalarNode('namer')->isRequired()->end()
63 5
                            ->scalarNode('processor')->isRequired()->end()
64 5
                            ->arrayNode('destinations')
65 5
                                ->isRequired()
66 5
                                ->requiresAtLeastOneElement()
67 5
                                ->prototype('scalar')->end()
68 5
                                ->beforeNormalization()
69 5
                                    ->ifString()
70 5
                                    ->then(function ($v) {
71 3
                                        return array($v);
72 5
                                    })
73 5
                                ->end()
74 5
                            ->end()
75 5
                        ->end()
76 5
                    ->end()
77 5
                ->end()
78 5
            ->end()
79
        ;
80
81 5
        return $treeBuilder;
82
    }
83
84
    /**
85
     * @param string $id
86
     *
87
     * @return Factory
88
     */
89 1
    public function getSourceFactory($id)
90
    {
91 1
        return $this->sourceFactories[$id];
92
    }
93
94
    /**
95
     * @param string $id
96
     *
97
     * @return Factory
98
     */
99 1
    public function getNamerFactory($id)
100
    {
101 1
        return $this->namerFactories[$id];
102
    }
103
104
    /**
105
     * @param string $id
106
     *
107
     * @return Factory
108
     */
109 1
    public function getDestinationFactory($id)
110
    {
111 1
        return $this->destinationFactories[$id];
112
    }
113
114
    /**
115
     * @param string $id
116
     *
117
     * @return Factory
118
     */
119 1
    public function getProcessorFactory($id)
120
    {
121 1
        return $this->processorFactories[$id];
122
    }
123
124
    /**
125
     * @param ArrayNodeDefinition $node
126
     * @param string              $plural
127
     * @param string              $singular
128
     * @param Factory[]           $factories
129
     */
130 5
    private function addFactories(ArrayNodeDefinition $node, $plural, $singular, array $factories)
131
    {
132
        $nodeBuilder = $node
133 5
            ->children()
134 5
                ->arrayNode($plural)
135 5
                    ->useAttributeAsKey('name')
136 5
                    ->prototype('array')
137 5
                        ->canBeUnset()
138 5
                        ->validate()
139 5
                            ->ifTrue(function ($v) {
140 1
                                return count($v) > 1;
141 5
                            })
142
                            ->thenInvalid(sprintf('Can only have 1 %s per configuration.', $singular))
143
                        ->end()
144
                        ->children()
145
        ;
146
147
        foreach ($factories as $name => $factory) {
148
            $factoryNode = $nodeBuilder->arrayNode($name);
149
150
            $factory->addConfiguration($factoryNode);
151
        }
152
    }
153
}
154