Completed
Push — master ( 6ff8ac...850b68 )
by Tom
86:44 queued 66:31
created

ReaderFactory::endsWith()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
namespace TomPHP\ConfigServiceProvider\FileReader;
4
5
use TomPHP\ConfigServiceProvider\Exception\UnknownFileTypeException;
6
use TomPHP\ConfigServiceProvider\FileReader\FileReader;
7
8
final class ReaderFactory
9
{
10
    /**
11
     * @var string[]
12
     */
13
    private $config;
14
15
    /**
16
     * @var FileReader[]
17
     */
18
    private $readers = [];
19
20
    /**
21
     * @param array $config
22
     */
23
    public function __construct(array $config)
24
    {
25
        $this->config = $config;
26
    }
27
28
    /**
29
     * @param mixed $filename
30
     *
31
     * @return FileReader
32
     */
33
    public function create($filename)
34
    {
35
        $readerClass = $this->getReaderClass($filename);
36
37
        if (!isset($this->readers[$readerClass])) {
38
            $this->readers[$readerClass] = new $readerClass();
39
        }
40
41
        return $this->readers[$readerClass];
42
    }
43
44
    /**
45
     * @param string $filename
46
     *
47
     * @return string
48
     */
49
    private function getReaderClass($filename)
50
    {
51
        $readerClass = null;
52
53
        foreach ($this->config as $extension => $className) {
54
            if ($this->endsWith($filename, $extension)) {
55
                $readerClass = $className;
56
                break;
57
            }
58
        }
59
60
        if ($readerClass === null) {
61
            throw UnknownFileTypeException::fromFileExtension(
62
                $filename,
63
                array_keys($this->config)
64
            );
65
        }
66
67
        return $readerClass;
68
    }
69
70
    /**
71
     * @param string $haystack
72
     * @param string $needle
73
     *
74
     * @return bool
75
     */
76
    private function endsWith($haystack, $needle)
77
    {
78
        return $needle === substr($haystack, -strlen($needle));
79
    }
80
}
81