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

DefaultDriverFactory   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 25
dl 0
loc 64
ccs 12
cts 12
cp 1
rs 10
c 0
b 0
f 0
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 2
A enableEnumSupport() 0 3 1
B createDriver() 0 30 7
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