Completed
Push — master ( e54095...b55a89 )
by Mr
02:48
created

Import::__construct()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3.3332

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 4
cts 6
cp 0.6667
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 2
crap 3.3332
1
<?php
2
3
namespace OpenVPN;
4
5
use OpenVPN\Interfaces\ConfigInterface;
6
use OpenVPN\Interfaces\ImportInterface;
7
use function strlen;
8
9
class Import implements ImportInterface
10
{
11
    /**
12
     * Lines of config file
13
     *
14
     * @var array
15
     */
16
    public $lines = [];
17
18
    /**
19
     * Import constructor, can import file on starting
20
     *
21
     * @param string|null $filename  Path to config file
22
     * @param bool        $isContent If true, then path mean content of config file
23
     */
24 3
    public function __construct(string $filename = null, bool $isContent = false)
25
    {
26 3
        if ($isContent) {
27
            $this->load($filename);
28 3
        } elseif (null !== $filename) {
29
            $this->read($filename);
30
        }
31 3
    }
32
33
    /**
34
     * Check if line is valid config line, TRUE if line is okay.
35
     * If empty line or line with comment then FALSE.
36
     *
37
     * @param string $line
38
     *
39
     * @return bool
40
     */
41 2
    private function isLine(string $line): bool
42
    {
43
        return !(
44
            // Empty lines
45 2
            preg_match('/^\n+|^[\t\s]*\n+/m', $line) ||
46
            // Lines with comments
47 2
            preg_match('/^#/m', $line)
48
        );
49
    }
50
51
    /**
52
     * Read configuration file line by line
53
     *
54
     * @param string $filename
55
     *
56
     * @return array Array with count of total and read lines
57
     */
58 1
    public function read(string $filename): array
59
    {
60 1
        $content = file_get_contents($filename);
61 1
        return $this->load($content);
62
    }
63
64
    /**
65
     * Load content from text of config
66
     *
67
     * @param string $content Content of config file
68
     *
69
     * @return array Array with count of total and read lines
70
     */
71 2
    public function load(string $content): array
72
    {
73 2
        $result = ['total' => 0, 'read' => 0];
74
75
        // Open file as SPL object
76 2
        $lines = explode("\n", $content);
77
78
        // Read line by line
79 2
        foreach ($lines as $line) {
80 2
            $line = trim($line);
81
            // Save line only of not empty
82 2
            if ($this->isLine($line) && strlen($line) > 1) {
83 2
                $line          = trim(preg_replace('/\s+/', ' ', $line));
84 2
                $this->lines[] = $line;
85 2
                $result['read']++;
86
            }
87 2
            $result['total']++;
88
        }
89 2
        return $result;
90
    }
91
92
    /**
93
     * Parse readed lines
94
     *
95
     * @return \OpenVPN\Interfaces\ConfigInterface
96
     */
97 3
    public function parse(): ConfigInterface
98
    {
99 3
        $config = new Config();
100 3
        array_map(
101
            static function ($line) use ($config) {
102 3
                if (preg_match('/^(\S+)( (.*))?/', $line, $matches)) {
103 3
                    $config->set($matches[1], $matches[3] ?? true);
104
                }
105 3
            },
106 3
            $this->lines
107
        );
108 3
        return $config;
109
    }
110
}
111