@@ -30,41 +30,127 @@ public function getConfigTreeBuilder()
3030 $ rootNode = $ treeBuilder ->root ('florianv_swap ' );
3131
3232 $ rootNode
33+ ->fixXmlConfig ('provider ' )
3334 ->validate ()
34- ->ifTrue (function ($ providers ) {
35- return !isset ($ providers ['providers ' ]) || count ($ providers ['providers ' ]) === 0 ;
35+ ->ifTrue (function ($ config ) {
36+ return !isset ($ config ['providers ' ]) || count ($ config ['providers ' ]) === 0 ;
3637 })
3738 ->thenInvalid ('You must define at least one provider. ' )
38- ->end ()
39+ ->end ()
3940 ->children ()
40- ->scalarNode ('http_adapter ' )->defaultValue ('florianv_swap.http_adapter.file_get_contents ' )->end ()
4141 ->arrayNode ('cache ' )
42+ ->addDefaultsIfNotSet ()
4243 ->children ()
43- ->integerNode ('ttl ' )->isRequired ()->end ()
44- ->append ($ this ->getCacheDriverNode ('doctrine ' ))
44+ ->integerNode ('ttl ' )
45+ ->defaultValue (3600 )
46+ ->end ()
47+ ->scalarNode ('type ' )
48+ ->info ('A cache type or service id ' )
49+ ->treatFalseLike (null )
50+ ->treatTrueLike (null )
51+ ->defaultNull ()
52+ ->end ()
4553 ->end ()
4654 ->end ()
4755 ->arrayNode ('providers ' )
4856 ->children ()
49- ->append ($ this ->createSimpleProviderNode ('yahoo_finance ' ))
50- ->append ($ this ->createSimpleProviderNode ('google_finance ' ))
57+ ->append ($ this ->createSimpleProviderNode ('fixer ' ))
58+ ->append ($ this ->createSimpleProviderNode ('google ' ))
59+ ->append ($ this ->createSimpleProviderNode ('cryptonator ' ))
60+ ->append ($ this ->createSimpleProviderNode ('webservicex ' ))
61+ ->append ($ this ->createSimpleProviderNode ('central_bank_of_czech_republic ' ))
62+ ->append ($ this ->createSimpleProviderNode ('central_bank_of_republic_turkey ' ))
5163 ->append ($ this ->createSimpleProviderNode ('european_central_bank ' ))
5264 ->append ($ this ->createSimpleProviderNode ('national_bank_of_romania ' ))
53- ->append ($ this ->createSimpleProviderNode ('central_bank_of_republic_turkey ' ))
65+ ->append ($ this ->createSimpleProviderNode ('russian_central_bank ' ))
66+ ->arrayNode ('currency_data_feed ' )
67+ ->children ()
68+ ->integerNode ('priority ' )->defaultValue (0 )->end ()
69+ ->scalarNode ('api_key ' )
70+ ->treatFalseLike (null )
71+ ->treatTrueLike (null )
72+ ->isRequired ()
73+ ->cannotBeEmpty ()
74+ ->end ()
75+ ->end ()
76+ ->end ()
77+ ->arrayNode ('currency_layer ' )
78+ ->children ()
79+ ->integerNode ('priority ' )->defaultValue (0 )->end ()
80+ ->scalarNode ('access_key ' )
81+ ->treatFalseLike (null )
82+ ->treatTrueLike (null )
83+ ->isRequired ()
84+ ->cannotBeEmpty ()
85+ ->end ()
86+ ->booleanNode ('enterprise ' )->defaultFalse ()->end ()
87+ ->end ()
88+ ->end ()
89+ ->arrayNode ('forge ' )
90+ ->children ()
91+ ->integerNode ('priority ' )->defaultValue (0 )->end ()
92+ ->scalarNode ('api_key ' )
93+ ->treatFalseLike (null )
94+ ->treatTrueLike (null )
95+ ->isRequired ()
96+ ->cannotBeEmpty ()
97+ ->end ()
98+ ->end ()
99+ ->end ()
54100 ->arrayNode ('open_exchange_rates ' )
55101 ->children ()
56102 ->integerNode ('priority ' )->defaultValue (0 )->end ()
57- ->scalarNode ('app_id ' )->isRequired ()->cannotBeEmpty ()->end ()
103+ ->scalarNode ('app_id ' )
104+ ->treatFalseLike (null )
105+ ->treatTrueLike (null )
106+ ->isRequired ()
107+ ->cannotBeEmpty ()
108+ ->end ()
58109 ->booleanNode ('enterprise ' )->defaultFalse ()->end ()
59110 ->end ()
60111 ->end ()
61112 ->arrayNode ('xignite ' )
62113 ->children ()
63114 ->integerNode ('priority ' )->defaultValue (0 )->end ()
64- ->scalarNode ('token ' )->isRequired ()->cannotBeEmpty ()->end ()
115+ ->scalarNode ('token ' )
116+ ->treatFalseLike (null )
117+ ->treatTrueLike (null )
118+ ->isRequired ()
119+ ->cannotBeEmpty ()
120+ ->end ()
121+ ->end ()
122+ ->end ()
123+ ->arrayNode ('array ' )
124+ ->children ()
125+ ->integerNode ('priority ' )->defaultValue (0 )->end ()
126+ ->variableNode ('rates ' )
127+ ->treatFalseLike (null )
128+ ->treatTrueLike (null )
129+ ->isRequired ()
130+ ->cannotBeEmpty ()
131+ ->validate ()
132+ ->ifTrue (function ($ config ) {
133+ if (!is_array ($ config ) || empty ($ config )) {
134+ return true ;
135+ }
136+
137+ foreach ($ config as $ entry ) {
138+ if (!is_array ($ entry ) || empty ($ entry )) {
139+ return true ;
140+ }
141+
142+ if (!$ this ->validateArrayProviderEntry ($ entry )) {
143+ return true ;
144+ }
145+ }
146+
147+ return false ;
148+ })
149+ ->thenInvalid ('Invalid configuration for array provider. ' )
150+ ->end ()
151+ ->end ()
65152 ->end ()
66153 ->end ()
67- ->append ($ this ->createSimpleProviderNode ('webservicex ' ))
68154 ->end ()
69155 ->end ()
70156 ->end ()
@@ -77,43 +163,37 @@ private function createSimpleProviderNode($name)
77163 {
78164 $ treeBuilder = new TreeBuilder ();
79165 $ node = $ treeBuilder ->root ($ name );
80-
81166 $ node
82167 ->children ()
83168 ->integerNode ('priority ' )->defaultValue (0 )->end ()
84169 ->end ()
85170 ;
86-
87171 return $ node ;
88172 }
89173
90174 /**
91- * Return a cache driver node
175+ * Validates an array provider config entry.
92176 *
93- * @param string $name
177+ * @param array $entry
94178 *
95- * @return ArrayNodeDefinition
179+ * @return bool
96180 */
97- private function getCacheDriverNode ( $ name )
181+ private function validateArrayProviderEntry ( array $ entry )
98182 {
99- $ treeBuilder = new TreeBuilder ();
100- $ node = $ treeBuilder ->root ($ name );
183+ foreach ($ entry as $ key => $ value ) {
184+ if (preg_match ('~^[1|2][0-9]{3}-[0-9]{2}-[0-9]{2}$~ ' , $ key )) {
185+ if (is_array ($ value )) {
186+ return $ this ->validateArrayProviderEntry ($ value );
187+ }
188+ } elseif (preg_match ('~^[A-Z]+/[A-Z]+$~ ' , $ key )) {
189+ if (is_float ($ value ) && 0 < $ value ) {
190+ continue ;
191+ }
192+ }
101193
102- $ node
103- ->addDefaultsIfNotSet ()
104- ->beforeNormalization ()
105- ->ifString ()
106- ->then (function ($ v ) { return array ('type ' => $ v ); })
107- ->end ()
108- ->isRequired ()
109- ->children ()
110- ->scalarNode ('type ' )
111- ->info ('A cache type or service id ' )
112- ->defaultValue ('array ' )
113- ->end ()
114- ->end ()
115- ;
194+ return false ;
195+ }
116196
117- return $ node ;
197+ return true ;
118198 }
119199}
0 commit comments