Completed
Pull Request — master (#21)
by
unknown
04:45
created

ComposerConfig::__call()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 9.2568
c 0
b 0
f 0
cc 5
nc 4
nop 2
1
<?php
2
3
namespace Arrilot\BitrixMigrations;
4
5
use RuntimeException;
6
7
/**
8
 * @method array|null getExtra()
9
*/
10
class ComposerConfig
11
{
12
    /**
13
     * Массив с данными из composer.json
14
    */
15
    private $config = null;
16
17
    /**
18
     * @param array $config
19
     */
20
    public function __construct(array $config)
21
    {
22
        $this->config = $config;
23
    }
24
25
    /**
26
     * @param string $file
27
     * @return ComposerConfig
28
     * @throws RuntimeException
29
     */
30
    public static function createFromFile($file)
31
    {
32
        $content = file_get_contents($file);
33
34
        if (file_exists($file) === false || $content === false) {
35
            throw new RuntimeException('Переданный файл не существует или не смогли считать данные из него');
36
        }
37
38
        $config = json_decode($content, true);
39
40
        if (json_last_error() !== JSON_ERROR_NONE) {
41
            throw new RuntimeException("Не удалось декодировать данные из файла");
42
        }
43
44
        return new static($config);
45
    }
46
47
    /**
48
     * @param $name
49
     * @param $arguments
50
     * @return mixed
51
     * @throws RuntimeException
52
     */
53
    public function __call($name, $arguments)
54
    {
55
        $isGetMethod = strpos($name, 'get');
56
57
        if ($isGetMethod === false || $isGetMethod !== 0) {
58
            throw new RuntimeException("Не существует метода ${name}");
59
        }
60
61
        $propertyName = substr($name, 3);
62
63
        if ($propertyName === false) {
64
            throw new RuntimeException("Не удалось извлечь имя свойства из метода ${name}");
65
        }
66
67
        $propertyName = strtolower($propertyName);
68
69
        if (!isset($this->config[$propertyName])) {
70
            throw new RuntimeException("Не существует свойства для метода ${name}");
71
        }
72
73
        return $this->config[$propertyName];
74
    }
75
}