Completed
Push — main ( 4c7f4a...512e28 )
by Dante
19s queued 12s
created

FileTrait   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 8
eloc 18
c 1
b 0
f 1
dl 0
loc 50
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B readFileStream() 0 38 8
1
<?php
2
declare(strict_types=1);
3
4
namespace BEdita\ImportTools\Utility;
5
6
use BEdita\Core\Filesystem\FilesystemRegistry;
7
8
/**
9
 * Utilities to help reading files from either the local filesystem or an adapter configured in BEdita.
10
 */
11
trait FileTrait
12
{
13
    /**
14
     * Open read-only file stream. Possible sources are:
15
     *  - `-` for STDIN
16
     *  - local paths
17
     *  - any URL supported by a registered PHP stream wrapper — notably, remote URLs via HTTP(S)
18
     *  - (if `bedita/core` is available) any mountpoint registered in `FilesystemRegistry`
19
     *
20
     * @param string $path Path to open file from.
21
     * @return array{resource, callable(): void}
0 ignored issues
show
Documentation Bug introduced by
The doc comment array{resource, callable(): void} at position 2 could not be parsed: Expected ':' at position 2, but found 'resource'.
Loading history...
22
     */
23
    protected static function readFileStream(string $path): array
24
    {
25
        /**
26
         * Create a function to close the requested resource.
27
         *
28
         * @param resource|null $fh Resource to be closed.
29
         * @return callable(): void Function to be used for closing the resource.
30
         */
31
        $closerFactory = fn ($resource): callable => function () use ($resource): void {
32
            if (is_resource($resource)) {
33
                fclose($resource);
34
            }
35
        };
36
37
        if ($path === '-') {
38
            return [STDIN, $closerFactory(null)]; // We don't really want to close STDIN.
39
        }
40
41
        if (!str_contains($path, '://') || in_array(explode('://', $path, 2)[0], stream_get_wrappers(), true)) {
42
            try {
43
                $fh = fopen($path, 'rb');
44
                if ($fh === false) {
45
                    trigger_error(sprintf('fopen(%s): falied to open stream', $path), E_USER_ERROR);
46
                }
47
            } catch (\Exception $previous) {
48
                throw new \RuntimeException(sprintf('Cannot open file: %s', $path), 0, $previous);
49
            }
50
51
            return [$fh, $closerFactory($fh)];
52
        }
53
54
        if (!class_exists(FilesystemRegistry::class)) {
55
            trigger_error(sprintf('Unsupported stream wrapper protocol: %s', $path), E_USER_ERROR);
56
        }
57
58
        $fh = FilesystemRegistry::getMountManager()->readStream($path);
59
60
        return [$fh, $closerFactory($fh)];
61
    }
62
}
63