Passed
Branch feature/metadata-options (5d4e4b)
by Pieter
02:39
created

ApieConfigResolver::getResolver()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 31
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 25
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 31
rs 9.52
1
<?php
2
namespace W2w\Laravel\Apie\Providers;
3
4
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
5
use Symfony\Component\OptionsResolver\Options;
6
use Symfony\Component\OptionsResolver\OptionsResolver;
7
use W2w\Lib\Apie\Resources\ApiResourcesInterface;
8
9
class ApieConfigResolver
10
{
11
    private static $configResolver;
12
13
    public static function resolveConfig(array $config)
14
    {
15
        $resolver = self::getResolver();
16
        return $resolver->resolve($config);
17
    }
18
19
    private static function getResolver(): OptionsResolver
20
    {
21
        if (!self::$configResolver) {
22
            $resolver = new OptionsResolver();
23
            $defaults = require __DIR__ . '/../../config/apie.php';
24
            $resolver->setDefaults($defaults)
25
                ->setAllowedTypes('resources', ['string[]', ApiResourcesInterface::class])
26
                ->setAllowedTypes('resources-service', ['null', 'string'])
27
                ->setAllowedTypes('mock', ['null', 'bool'])
28
                ->setAllowedTypes('mock-skipped-resources', ['string[]'])
29
                ->setAllowedTypes('base-url', 'string')
30
                ->setAllowedTypes('api-url', 'string')
31
                ->setAllowedTypes('disable-routes', ['null', 'bool'])
32
                ->setAllowedTypes('swagger-ui-test-page', ['null', 'string'])
33
                ->setAllowedTypes('apie-middleware', 'string[]')
34
                ->setAllowedTypes('swagger-ui-test-page-middleware', 'string[]')
35
                ->setAllowedTypes('bind-api-resource-facade-response', 'bool')
36
                ->setAllowedTypes('metadata', 'string[]');
37
            $resolver->setDefault('metadata', function (OptionsResolver $metadataResolver) use (&$defaults) {
38
                $metadataResolver->setDefaults($defaults['metadata']);
39
40
                $urlNormalizer = function (Options $options, $value) {
41
                    return self::urlNormalize($value);
42
                };
43
                $metadataResolver->setNormalizer('terms-of-service', $urlNormalizer);
44
                $metadataResolver->setNormalizer('license-url', $urlNormalizer);
45
                $metadataResolver->setNormalizer('contact-url', $urlNormalizer);
46
            });
47
            self::$configResolver = $resolver;
48
        }
49
        return self::$configResolver;
50
    }
51
52
    private static function urlNormalize($value)
53
    {
54
        if ($value === '') {
55
            return '';
56
        }
57
        if ('http://' !== substr($value, 0, 7) && 'https://' !== substr($value, 0, 8)) {
58
            $value = 'https://'.$value;
59
        }
60
        $parsedUrl = parse_url($value);
61
        if (empty($parsedUrl) || !in_array($parsedUrl['scheme'], ['http', 'https']) || !filter_var($value, FILTER_VALIDATE_URL)) {
62
            throw new InvalidOptionsException('"' . $value . '" is not a valid url');
63
        }
64
65
        return $value;
66
    }
67
}
68