Passed
Push — master ( 86abb8...57f290 )
by Tomáš
12:38
created

Handler   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Test Coverage

Coverage 87.5%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 5
eloc 15
c 2
b 0
f 0
dl 0
loc 55
ccs 14
cts 16
cp 0.875
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A withErrorHandler() 0 8 1
A withErrorHandlerForDOMDocument() 0 9 2
A withErrorHandlerForXMLReader() 0 11 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
            return false;
54 38
        }, $callback);
55
    }
56
57
    /**
58
     * Register custom error handler to throw \Exception on warning message
59
     */
60 47
    private static function withErrorHandler(callable $errorCallback, callable $functionCallback): mixed
61
    {
62 47
        set_error_handler($errorCallback);
63
64
        try {
65 47
            return $functionCallback();
66
        } finally {
67 47
            restore_error_handler();
68
        }
69
    }
70
}
71