xref: /plugin/combo/vendor/symfony/yaml/Exception/ParseException.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau/*
4*04fd306cSNickeau * This file is part of the Symfony package.
5*04fd306cSNickeau *
6*04fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com>
7*04fd306cSNickeau *
8*04fd306cSNickeau * For the full copyright and license information, please view the LICENSE
9*04fd306cSNickeau * file that was distributed with this source code.
10*04fd306cSNickeau */
11*04fd306cSNickeau
12*04fd306cSNickeaunamespace Symfony\Component\Yaml\Exception;
13*04fd306cSNickeau
14*04fd306cSNickeau/**
15*04fd306cSNickeau * Exception class thrown when an error occurs during parsing.
16*04fd306cSNickeau *
17*04fd306cSNickeau * @author Fabien Potencier <fabien@symfony.com>
18*04fd306cSNickeau */
19*04fd306cSNickeauclass ParseException extends RuntimeException
20*04fd306cSNickeau{
21*04fd306cSNickeau    private $parsedFile;
22*04fd306cSNickeau    private $parsedLine;
23*04fd306cSNickeau    private $snippet;
24*04fd306cSNickeau    private $rawMessage;
25*04fd306cSNickeau
26*04fd306cSNickeau    /**
27*04fd306cSNickeau     * @param string      $message    The error message
28*04fd306cSNickeau     * @param int         $parsedLine The line where the error occurred
29*04fd306cSNickeau     * @param string|null $snippet    The snippet of code near the problem
30*04fd306cSNickeau     * @param string|null $parsedFile The file name where the error occurred
31*04fd306cSNickeau     */
32*04fd306cSNickeau    public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Throwable $previous = null)
33*04fd306cSNickeau    {
34*04fd306cSNickeau        $this->parsedFile = $parsedFile;
35*04fd306cSNickeau        $this->parsedLine = $parsedLine;
36*04fd306cSNickeau        $this->snippet = $snippet;
37*04fd306cSNickeau        $this->rawMessage = $message;
38*04fd306cSNickeau
39*04fd306cSNickeau        $this->updateRepr();
40*04fd306cSNickeau
41*04fd306cSNickeau        parent::__construct($this->message, 0, $previous);
42*04fd306cSNickeau    }
43*04fd306cSNickeau
44*04fd306cSNickeau    /**
45*04fd306cSNickeau     * Gets the snippet of code near the error.
46*04fd306cSNickeau     *
47*04fd306cSNickeau     * @return string
48*04fd306cSNickeau     */
49*04fd306cSNickeau    public function getSnippet()
50*04fd306cSNickeau    {
51*04fd306cSNickeau        return $this->snippet;
52*04fd306cSNickeau    }
53*04fd306cSNickeau
54*04fd306cSNickeau    /**
55*04fd306cSNickeau     * Sets the snippet of code near the error.
56*04fd306cSNickeau     */
57*04fd306cSNickeau    public function setSnippet(string $snippet)
58*04fd306cSNickeau    {
59*04fd306cSNickeau        $this->snippet = $snippet;
60*04fd306cSNickeau
61*04fd306cSNickeau        $this->updateRepr();
62*04fd306cSNickeau    }
63*04fd306cSNickeau
64*04fd306cSNickeau    /**
65*04fd306cSNickeau     * Gets the filename where the error occurred.
66*04fd306cSNickeau     *
67*04fd306cSNickeau     * This method returns null if a string is parsed.
68*04fd306cSNickeau     *
69*04fd306cSNickeau     * @return string
70*04fd306cSNickeau     */
71*04fd306cSNickeau    public function getParsedFile()
72*04fd306cSNickeau    {
73*04fd306cSNickeau        return $this->parsedFile;
74*04fd306cSNickeau    }
75*04fd306cSNickeau
76*04fd306cSNickeau    /**
77*04fd306cSNickeau     * Sets the filename where the error occurred.
78*04fd306cSNickeau     */
79*04fd306cSNickeau    public function setParsedFile(string $parsedFile)
80*04fd306cSNickeau    {
81*04fd306cSNickeau        $this->parsedFile = $parsedFile;
82*04fd306cSNickeau
83*04fd306cSNickeau        $this->updateRepr();
84*04fd306cSNickeau    }
85*04fd306cSNickeau
86*04fd306cSNickeau    /**
87*04fd306cSNickeau     * Gets the line where the error occurred.
88*04fd306cSNickeau     *
89*04fd306cSNickeau     * @return int
90*04fd306cSNickeau     */
91*04fd306cSNickeau    public function getParsedLine()
92*04fd306cSNickeau    {
93*04fd306cSNickeau        return $this->parsedLine;
94*04fd306cSNickeau    }
95*04fd306cSNickeau
96*04fd306cSNickeau    /**
97*04fd306cSNickeau     * Sets the line where the error occurred.
98*04fd306cSNickeau     */
99*04fd306cSNickeau    public function setParsedLine(int $parsedLine)
100*04fd306cSNickeau    {
101*04fd306cSNickeau        $this->parsedLine = $parsedLine;
102*04fd306cSNickeau
103*04fd306cSNickeau        $this->updateRepr();
104*04fd306cSNickeau    }
105*04fd306cSNickeau
106*04fd306cSNickeau    private function updateRepr()
107*04fd306cSNickeau    {
108*04fd306cSNickeau        $this->message = $this->rawMessage;
109*04fd306cSNickeau
110*04fd306cSNickeau        $dot = false;
111*04fd306cSNickeau        if ('.' === substr($this->message, -1)) {
112*04fd306cSNickeau            $this->message = substr($this->message, 0, -1);
113*04fd306cSNickeau            $dot = true;
114*04fd306cSNickeau        }
115*04fd306cSNickeau
116*04fd306cSNickeau        if (null !== $this->parsedFile) {
117*04fd306cSNickeau            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
118*04fd306cSNickeau        }
119*04fd306cSNickeau
120*04fd306cSNickeau        if ($this->parsedLine >= 0) {
121*04fd306cSNickeau            $this->message .= sprintf(' at line %d', $this->parsedLine);
122*04fd306cSNickeau        }
123*04fd306cSNickeau
124*04fd306cSNickeau        if ($this->snippet) {
125*04fd306cSNickeau            $this->message .= sprintf(' (near "%s")', $this->snippet);
126*04fd306cSNickeau        }
127*04fd306cSNickeau
128*04fd306cSNickeau        if ($dot) {
129*04fd306cSNickeau            $this->message .= '.';
130*04fd306cSNickeau        }
131*04fd306cSNickeau    }
132*04fd306cSNickeau}
133