Handler::withErrorHandler()   A
last analyzed

Complexity

Conditions 1
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 5
c 2
b 0
f 0
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 10
cc 1
nc 2
nop 2
crap 1
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 41
    public static function withErrorHandlerForXMLReader(callable $callback): mixed
25
    {
26 41
        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 41
        }, $callback);
35
    }
36
37
    /**
38
     * @param callable(): T $callback
39
     *
40
     * @return T
41
     *
42
     * @throws \DOMException
43
     *
44
     * @template T
45
     */
46 62
    public static function withErrorHandlerForDOMDocument(callable $callback): mixed
47
    {
48 62
        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 62
        }, $callback);
57
    }
58
59
    /**
60
     * Register custom error handler to throw \Exception on warning message
61
     */
62 74
    private static function withErrorHandler(callable $errorCallback, callable $functionCallback): mixed
63
    {
64 74
        set_error_handler($errorCallback);
65
66
        try {
67 74
            return $functionCallback();
68
        } finally {
69 74
            restore_error_handler();
70
        }
71
    }
72
}
73