Configuration::createSubscribersNode()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 14
nc 1
nop 0
1
<?php
2
3
/*
4
 * This file is part of the Ivory Http Adapter bundle package.
5
 *
6
 * (c) Eric GELOEN <[email protected]>
7
 *
8
 * For the full copyright and license information, please read the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Ivory\HttpAdapterBundle\DependencyInjection;
13
14
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
16
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
17
use Symfony\Component\Config\Definition\ConfigurationInterface;
18
19
/**
20
 * @author GeLo <[email protected]>
21
 */
22
class Configuration implements ConfigurationInterface
23
{
24
    /**
25
     * {@inheritdoc}
26
     */
27
    public function getConfigTreeBuilder()
28
    {
29
        $treeBuilder = $this->createTreeBuilder();
30
        $treeBuilder
31
            ->root('ivory_http_adapter')
32
            ->beforeNormalization()
33
                ->always(function ($config) {
34
                    if (empty($config['adapters'])) {
35
                        $config['adapters'] = ['default' => ['type' => 'socket']];
36
                    }
37
38
                    if (!isset($config['default'])) {
39
                        reset($config['adapters']);
40
                        $config['default'] = key($config['adapters']);
41
                    }
42
43
                    return $config;
44
                })
45
            ->end()
46
            ->children()
47
                ->scalarNode('default')->end()
48
                ->append($this->createAdaptersNode())
49
                ->append($this->createConfigsNode())
50
                ->append($this->createSubscribersNode())
51
            ->end();
52
53
        return $treeBuilder;
54
    }
55
56
    /**
57
     * @return NodeDefinition
58
     */
59
    private function createAdaptersNode()
60
    {
61
        return $this->createNode('adapters')
62
            ->useAttributeAsKey('name')
63
            ->prototype('array')
64
                ->children()
65
                    ->scalarNode('type')->isRequired()->end()
66
                    ->append($this->createConfigsNode())
67
                    ->append($this->createSubscribersNode())
68
                ->end()
69
            ->end();
70
    }
71
72
    /**
73
     * @return NodeDefinition
74
     */
75
    private function createConfigsNode()
76
    {
77
        return $this->createNode('configs')
78
            ->addDefaultsIfNotSet()
79
            ->children()
80
                ->scalarNode('protocol_version')->end()
81
                ->booleanNode('keep_alive')->end()
82
                ->scalarNode('encoding_type')->end()
83
                ->scalarNode('boundary')->end()
84
                ->scalarNode('timeout')->end()
85
                ->scalarNode('user_agent')->end()
86
            ->end();
87
    }
88
89
    /**
90
     * @return NodeDefinition
91
     */
92
    private function createSubscribersNode()
93
    {
94
        return $this->createNode('subscribers')
95
            ->canBeEnabled()
96
            ->children()
97
                ->append($this->createBasicAuthSubscriberNode())
98
                ->append($this->createCacheSubscriberNode())
99
                ->append($this->createRedirectSubscriberNode())
100
                ->scalarNode('cookie')->end()
101
                ->scalarNode('history')->end()
102
                ->scalarNode('logger')->end()
103
                ->booleanNode('retry')->end()
104
                ->booleanNode('status_code')->end()
105
                ->scalarNode('stopwatch')->end()
106
            ->end();
107
    }
108
109
    /**
110
     * @return NodeDefinition
111
     */
112
    private function createBasicAuthSubscriberNode()
113
    {
114
        return $this->createNode('basic_auth')
115
            ->children()
116
                ->scalarNode('username')->isRequired()->end()
117
                ->scalarNode('password')->isRequired()->end()
118
                ->scalarNode('matcher')->end()
119
            ->end();
120
    }
121
122
    /**
123
     * @return NodeDefinition
124
     */
125
    private function createCacheSubscriberNode()
126
    {
127
        return $this->createNode('cache')
128
            ->children()
129
                ->scalarNode('adapter')->isRequired()->end()
130
                ->integerNode('lifetime')->defaultValue(null)->end()
131
                ->booleanNode('exception')->defaultValue(true)->end()
132
            ->end();
133
    }
134
135
    /**
136
     * @return NodeDefinition
137
     */
138
    private function createRedirectSubscriberNode()
139
    {
140
        return $this->createNode('redirect')
141
            ->children()
142
                ->scalarNode('max')->end()
143
                ->booleanNode('strict')->end()
144
                ->booleanNode('throw_exception')->end()
145
            ->end();
146
    }
147
148
    /**
149
     * @param string $name
150
     *
151
     * @return NodeDefinition|ArrayNodeDefinition
152
     */
153
    private function createNode($name)
154
    {
155
        return $this->createTreeBuilder()->root($name);
156
    }
157
158
    /**
159
     * @return TreeBuilder
160
     */
161
    private function createTreeBuilder()
162
    {
163
        return new TreeBuilder();
164
    }
165
}
166