pheature-flags/symfony-toggle

View on GitHub
src/DependencyInjection/Configuration.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

declare(strict_types=1);

namespace Pheature\Community\Symfony\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
    /**
     * @psalm-suppress UndefinedInterfaceMethod
     * @return TreeBuilder
     */
    public function getConfigTreeBuilder(): TreeBuilder
    {
        $treeBuilder = new TreeBuilder('pheature_flags');
        /** @var ArrayNodeDefinition $rootNode */
        $rootNode = $treeBuilder->getRootNode();
        /** @phpstan-ignore-next-line */
        $rootNode->children()
            ->enumNode('driver')
                ->values(['inmemory', 'dbal', 'chain'])
            ->end()
            ->arrayNode('driver_options')
                ->scalarPrototype()->end()
            ->end()
            ->scalarNode('api_prefix')
                ->defaultValue('')
            ->end()
            ->booleanNode('api_enabled')
                ->defaultFalse()
            ->end()
        ->end();

        $this->addStrategyTypes($rootNode);
        $this->addSegmentTypes($rootNode);
        $this->addToggles($rootNode);

        return $treeBuilder;
    }

    /** @psalm-suppress UndefinedInterfaceMethod */
    private function addStrategyTypes(ArrayNodeDefinition $rootNode): void
    {
        /** @phpstan-ignore-next-line */
        $rootNode
            ->children()
                ->arrayNode('strategy_types')
                    ->arrayPrototype()
                        ->children()
                            ->scalarNode('type')
                                ->isRequired()
                                ->cannotBeEmpty()
                            ->end()
                            ->scalarNode('factory_id')
                                ->isRequired()
                                ->cannotBeEmpty()
                            ->end()
                        ->end()
                    ->end()
                ->end();
    }

    /** @psalm-suppress UndefinedInterfaceMethod */
    private function addSegmentTypes(ArrayNodeDefinition $rootNode): void
    {
        /** @phpstan-ignore-next-line */
        $rootNode
            ->children()
                ->arrayNode('segment_types')
                    ->arrayPrototype()
                        ->children()
                            ->scalarNode('type')
                                ->isRequired()
                                ->cannotBeEmpty()
                            ->end()
                            ->scalarNode('factory_id')
                                ->isRequired()
                                ->cannotBeEmpty()
                            ->end()
                        ->end()
                    ->end()
                ->end();
    }

    /** @psalm-suppress UndefinedInterfaceMethod */
    private function addToggles(ArrayNodeDefinition $rootNode): void
    {
        /** @phpstan-ignore-next-line */
        $rootNode
            ->children()
                ->arrayNode('toggles')
                    ->arrayPrototype()
                        ->children()
                            ->scalarNode('id')->end()
                            ->scalarNode('enabled')->end()
                            ->arrayNode('strategies')
                                ->arrayPrototype()
                                    ->children()
                                        ->scalarNode('strategy_id')->end()
                                        ->scalarNode('strategy_type')->end()
                                        ->arrayNode('segments')
                                            ->arrayPrototype()
                                                ->children()
                                                    ->scalarNode('segment_id')->end()
                                                    ->scalarNode('segment_type')->end()
                                                    ->variableNode('criteria')->end()
                                                ->end()
                                            ->end()
                                        ->end()
                                    ->end()
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end();
    }
}