Test Failed
Push — master ( e6f4b5...c3cccf )
by
unknown
15:56
created

XmlException::getErrors()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * LibreDTE: Biblioteca PHP (Núcleo).
7
 * Copyright (C) LibreDTE <https://www.libredte.cl>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de
20
 * GNU junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace libredte\lib\Core\Xml;
26
27
use Exception;
28
use LibXMLError;
29
use Throwable;
30
31
/**
32
 * Excepción personalizada para errores asociados a los XML.
33
 */
34
class XmlException extends Exception
35
{
36
    /**
37
     * Arreglo con los errores.
38
     *
39
     * @var array
40
     */
41
    private array $errors;
42
43
    /**
44
     * Constructor de la excepción.
45
     *
46
     * @param string $message Mensaje de la excepción.
47
     * @param array $errors Arreglo con errores con los detalles.
48
     * @param int $code Código de la excepción (opcional).
49
     * @param Throwable|null $previous Excepción previa (opcional).
50
     */
51 1
    public function __construct(
52
        string $message,
53
        array $errors = [],
54
        int $code = 0,
55
        Throwable $previous = null
56
    ) {
57 1
        $message = trim(sprintf(
58 1
            '%s %s',
59 1
            $message,
60 1
            implode(' ', $this->libXmlErrorToString($errors))
61 1
        ));
62
63 1
        $this->errors = $errors;
64 1
        parent::__construct($message, $code, $previous);
65
    }
66
67
    /**
68
     * Obtiene el arreglo con los errores.
69
     *
70
     * @return array Arreglo con los errores.
71
     */
72
    public function getErrors(): array
73
    {
74
        return $this->errors;
75
    }
76
77
    /**
78
     * Procesa un arreglo de errores, probablemente de LibXMLError, y los
79
     * entrega como un arreglo de strings.
80
     *
81
     * @param array $errors
82
     * @return array
83
     */
84 1
    private function libXmlErrorToString(array $errors): array
85
    {
86 1
        return array_map(function ($error) {
87
            if ($error instanceof LibXMLError) {
88
                return sprintf(
89
                    'Error %s: %s en la línea %d, columna %d (Código: %d).',
90
                    $error->level === LIBXML_ERR_WARNING ? 'Advertencia' :
91
                    ($error->level === LIBXML_ERR_ERROR ? 'Error' : 'Fatal'),
92
                    trim($error->message),
93
                    $error->line,
94
                    $error->column,
95
                    $error->code
96
                );
97
            }
98
99
            return $error;
100 1
        }, $errors);
101
    }
102
}
103