wiki.techinc.nl/includes/Rest/HeaderParser/HeaderParserBase.php
Umherirrender 44fd53fee3 Using @return never documentation on always-throw-function
This helps phan to detect unreachable code and also impossible types
after the functions.
It helps phan to avoid false positives for array keys
when the keys are checked before

Bug: T240141
Change-Id: I895f70e82b3053a46cd44135b15437e6f82a07b2
2021-09-07 17:29:03 +02:00

97 lines
2.1 KiB
PHP

<?php
namespace MediaWiki\Rest\HeaderParser;
/**
* @internal
*/
class HeaderParserBase {
/**
* @var string The input string being processed
*/
protected $input;
/**
* @var int The position within $input
*/
protected $pos;
/**
* @var int The length of $input
*/
protected $inputLength;
/**
* Set the input, and derived convenience properties
*
* @param string $input
*/
protected function setInput( $input ) {
$this->input = $input;
$this->pos = 0;
$this->inputLength = strlen( $input );
}
/**
* Consume a specified string, or throw an exception.
*
* @param string $s
* @throws HeaderParserError
*/
protected function consumeString( $s ) {
if ( $this->pos >= $this->inputLength ) {
$this->error( "Expected \"$s\" but got end of string" );
}
if ( substr_compare( $this->input, $s, $this->pos, strlen( $s ) ) === 0 ) {
$this->pos += strlen( $s );
} else {
$this->error( "Expected \"$s\"" );
}
}
/**
* Skip whitespace at the input position (OWS)
*/
protected function skipWhitespace() {
$this->pos += strspn( $this->input, " \t", $this->pos );
}
/**
* Throw an exception to indicate a parse error
*
* @param string $message
* @throws HeaderParserError
* @return never
*/
protected function error( $message ) {
throw new HeaderParserError( "$message at {$this->pos}" );
}
/**
* Consume a specified number of digits, or throw an exception
*
* @param int $numDigits
* @return string
* @throws HeaderParserError
*/
protected function consumeFixedDigits( $numDigits ) {
$digits = substr( $this->input, $this->pos, $numDigits );
if ( strlen( $digits ) !== $numDigits || !preg_match( '/^[0-9]*$/', $digits ) ) {
$this->error( "expected $numDigits digits" );
}
$this->pos += $numDigits;
return $digits;
}
/**
* If the position is not at the end of the input string, raise an error,
* complaining of trailing characters.
*
* @throws HeaderParserError
*/
protected function assertEnd() {
if ( $this->pos !== $this->inputLength ) {
$this->error( "trailing characters" );
}
}
}