YamlLoggableExtractor   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 20
c 0
b 0
f 0
dl 0
loc 43
rs 10
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
A extractPath() 0 19 4
A buildLoggableClasses() 0 5 2
A validateLoggableClass() 0 12 5
1
<?php
2
3
namespace Locastic\Loggastic\Metadata\Extractor;
4
5
use Symfony\Component\Yaml\Exception\ParseException;
6
use Symfony\Component\Yaml\Yaml;
7
8
final class YamlLoggableExtractor extends AbstractLoggableExtractor
9
{
10
    protected function extractPath(string $path): void
11
    {
12
        try {
13
            $loggableClasses = Yaml::parse((string) file_get_contents($path), Yaml::PARSE_CONSTANT);
14
        } catch (ParseException $e) {
15
            $e->setParsedFile($path);
16
17
            throw new \InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
18
        }
19
20
        if (null === $loggableClasses = $loggableClasses['locastic_loggable'] ?? $loggableClasses) {
21
            return;
22
        }
23
24
        if (!\is_array($loggableClasses)) {
25
            throw new \InvalidArgumentException(sprintf('"locastic_loggable" setting is expected to be null or an array, %s given in "%s".', \gettype($loggableClasses), $path));
26
        }
27
28
        $this->buildLoggableClasses($loggableClasses, $path);
29
    }
30
31
    private function buildLoggableClasses(array $loggableClasses, $path): void
32
    {
33
        foreach ($loggableClasses as $loggableClassConfig) {
34
            $this->validateLoggableClass($loggableClassConfig, $path);
35
            $this->loggableClasses[$loggableClassConfig['class']] = ['groups' => $loggableClassConfig['groups']];
36
        }
37
    }
38
39
    private function validateLoggableClass(array $loggableClassConfig, $path): void
40
    {
41
        if (!array_key_exists('class', $loggableClassConfig) || !array_key_exists('groups', $loggableClassConfig)) {
42
            throw new \InvalidArgumentException(sprintf('Invalid configuration for "locastic_loggable" in "%s".', $path));
43
        }
44
45
        if (!is_array($loggableClassConfig['groups'])) {
46
            throw new \InvalidArgumentException(sprintf('Invalid configuration for "locastic_loggable": "groups" must be an array, %s given in "%s".', \gettype($loggableClassConfig['groups']), $path));
47
        }
48
49
        if (!class_exists($loggableClassConfig['class'])) {
50
            throw new \InvalidArgumentException(sprintf('Invalid configuration for "locastic_loggable" in "%s": class "%s" does not exist.', $path, $loggableClassConfig['class']));
51
        }
52
    }
53
}
54