Passed
Push — master ( ced939...dcddfc )
by Tomáš
12:32
created

Handler::withErrorHandlerForXMLReader()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 11
ccs 5
cts 5
cp 1
rs 10
cc 2
nc 1
nop 1
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Inspirum\XML\Exception;
6
7
use DOMException;
8
use Exception;
9
use function restore_error_handler;
10
use function set_error_handler;
11
use function str_contains;
12
13
final class Handler
14
{
15
    /**
16
     * @param callable(): T $callback
17
     *
18
     * @return T
19
     *
20
     * @throws \Exception
21
     *
22
     * @template T
23
     */
24 16
    public static function withErrorHandlerForXMLReader(callable $callback): mixed
25
    {
26 16
        return self::withErrorHandler(static function (int $code, string $message): bool {
27 3
            if (str_contains($message, 'XMLReader::')) {
28 3
                throw new Exception($message, $code);
29
            }
30
31
            // @codeCoverageIgnoreStart
32
            return false;
33
            // @codeCoverageIgnoreEnd
34 16
        }, $callback);
35
    }
36
37
    /**
38
     * @param callable(): T $callback
39
     *
40
     * @return T
41
     *
42
     * @throws \DOMException
43
     *
44
     * @template T
45
     */
46 38
    public static function withErrorHandlerForDOMDocument(callable $callback): mixed
47
    {
48 38
        return self::withErrorHandler(static function (int $code, string $message): bool {
49 6
            if (str_contains($message, 'DOMDocument::')) {
50 6
                throw new DOMException($message, $code);
51
            }
52
53
            // @codeCoverageIgnoreStart
54
            return false;
55
            // @codeCoverageIgnoreEnd
56 38
        }, $callback);
57
    }
58
59
    /**
60
     * Register custom error handler to throw \Exception on warning message
61
     */
62 47
    private static function withErrorHandler(callable $errorCallback, callable $functionCallback): mixed
63
    {
64 47
        set_error_handler($errorCallback);
65
66
        try {
67 47
            return $functionCallback();
68
        } finally {
69 47
            restore_error_handler();
70
        }
71
    }
72
}
73