Import::parse()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 8
cts 8
cp 1
rs 9.7666
c 0
b 0
f 0
cc 2
nc 1
nop 0
crap 2
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
     * {@inheritDoc}
53
     */
54 1
    public function read(string $filename): array
55
    {
56 1
        $content = file_get_contents($filename);
57
58 1
        return $this->load($content);
59
    }
60
61
    /**
62
     * {@inheritDoc}
63
     */
64 2
    public function load($content, string $type = 'raw'): array
65
    {
66 2
        $result = ['total' => 0, 'read' => 0];
67 2
        $lines  = [];
68
69 2
        if (is_array($content)) {
70
            $lines = $content;
71 2
        } elseif ($type === 'raw') {
72 2
            $lines = explode("\n", $content);
73
        } elseif ($type === 'json') {
74
            $lines = json_decode($content, false);
75
        }
76
77
        // Read line by line
78 2
        foreach ($lines as $line) {
79 2
            $line = trim($line);
80
            // Save line only of not empty
81 2
            if ($this->isLine($line) && strlen($line) > 1) {
82 2
                $line          = trim(preg_replace('/\s+/', ' ', $line));
83 2
                $this->lines[] = $line;
84 2
                $result['read']++;
85
            }
86 2
            $result['total']++;
87
        }
88
89 2
        return $result;
90
    }
91
92
    /**
93
     * {@inheritDoc}
94
     */
95 3
    public function parse(): ConfigInterface
96
    {
97 3
        $config = new Config();
98
99 3
        array_map(
100
            static function ($line) use ($config) {
101 3
                if (preg_match('/^(\S+)( (.*))?/', $line, $matches)) {
102 3
                    $config->set($matches[1], $matches[3] ?? true);
103
                }
104 3
            },
105 3
            $this->lines
106
        );
107
108 3
        return $config;
109
    }
110
}
111