Passed
Pull Request — master (#1463)
by Marcin
11:42
created

DefaultDriverFactory::createDriver()   B

Complexity

Conditions 7
Paths 32

Size

Total Lines 30
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
cc 7
eloc 16
nc 32
nop 2
dl 0
loc 30
ccs 0
cts 0
cp 0
crap 56
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace JMS\Serializer\Builder;
6
7
use Doctrine\Common\Annotations\Reader;
8
use JMS\Serializer\Expression\CompilableExpressionEvaluatorInterface;
9
use JMS\Serializer\Metadata\Driver\AnnotationDriver;
10
use JMS\Serializer\Metadata\Driver\AttributeDriver;
11
use JMS\Serializer\Metadata\Driver\DefaultValuePropertyDriver;
12
use JMS\Serializer\Metadata\Driver\EnumPropertiesDriver;
13
use JMS\Serializer\Metadata\Driver\TypedPropertiesDriver;
14
use JMS\Serializer\Metadata\Driver\XmlDriver;
15
use JMS\Serializer\Metadata\Driver\YamlDriver;
16
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
17
use JMS\Serializer\Type\Parser;
18
use JMS\Serializer\Type\ParserInterface;
19
use Metadata\Driver\DriverChain;
20
use Metadata\Driver\DriverInterface;
21
use Metadata\Driver\FileLocator;
22
23
final class DefaultDriverFactory implements DriverFactoryInterface
24
{
25
    /**
26 330
     * @var ParserInterface
27
     */
28 330
    private $typeParser;
29 330
30 330
    /**
31
     * @var bool
32 330
     */
33
    private $enableEnumSupport = false;
34 330
35 2
    /**
36
     * @var PropertyNamingStrategyInterface
37 2
     */
38 2
    private $propertyNamingStrategy;
39 2
40 2
    /**
41
     * @var CompilableExpressionEvaluatorInterface
42
     */
43
    private $expressionEvaluator;
44 330
45
    public function __construct(PropertyNamingStrategyInterface $propertyNamingStrategy, ?ParserInterface $typeParser = null, ?CompilableExpressionEvaluatorInterface $expressionEvaluator = null)
46
    {
47
        $this->typeParser = $typeParser ?: new Parser();
48
        $this->propertyNamingStrategy = $propertyNamingStrategy;
49
        $this->expressionEvaluator = $expressionEvaluator;
50
    }
51
52
    public function enableEnumSupport(bool $enableEnumSupport = true): void
53
    {
54
        $this->enableEnumSupport = $enableEnumSupport;
55
    }
56
57
    public function createDriver(array $metadataDirs, Reader $annotationReader): DriverInterface
58
    {
59
        if (PHP_VERSION_ID >= 80000) {
60
            $annotationReader = new AttributeDriver\AttributeReader($annotationReader);
61
        }
62
63
        $driver = new AnnotationDriver($annotationReader, $this->propertyNamingStrategy, $this->typeParser);
64
65
        if (!empty($metadataDirs)) {
66
            $fileLocator = new FileLocator($metadataDirs);
67
            $driver = new DriverChain([
68
                new YamlDriver($fileLocator, $this->propertyNamingStrategy, $this->typeParser, $this->expressionEvaluator),
69
                new XmlDriver($fileLocator, $this->propertyNamingStrategy, $this->typeParser, $this->expressionEvaluator),
70
                $driver,
71
            ]);
72
        }
73
74
        if (PHP_VERSION_ID >= 70400) {
75
            $driver = new TypedPropertiesDriver($driver, $this->typeParser);
76
        }
77
78
        if (PHP_VERSION_ID >= 80000) {
79
            $driver = new DefaultValuePropertyDriver($driver);
80
        }
81
82
        if (PHP_VERSION_ID >= 80100 && $this->enableEnumSupport) {
83
            $driver = new EnumPropertiesDriver($driver);
84
        }
85
86
        return $driver;
87
    }
88
}
89