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