Page MenuHomeWickedGov Phorge

StringDef.php
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

StringDef.php

<?php
namespace Wikimedia\ParamValidator\TypeDef;
use Wikimedia\Message\MessageValue;
use Wikimedia\ParamValidator\Callbacks;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\ParamValidator\TypeDef;
/**
* Type definition for string types
*
* The result from validate() is a PHP string.
*
* Failure codes:
* - 'missingparam': The parameter is the empty string (and that's not allowed). No data.
*
* Additional codes may be generated when using certain PARAM constants. See
* the constants' documentation for details.
*
* @since 1.34
* @unstable
*/
class StringDef extends TypeDef {
/**
* When this option is set, the empty string is considered a proper value.
*/
public const OPT_ALLOW_EMPTY = 'allowEmptyWhenRequired';
/**
* (integer) Maximum length of a string in bytes.
*
* Failure codes:
* - 'maxbytes': The string is too long. Data:
* - 'maxbytes': The maximum number of bytes allowed, or null if no limit
* - 'maxchars': The maximum number of characters allowed, or null if no limit
*/
public const PARAM_MAX_BYTES = 'param-max-bytes';
/**
* (integer) Maximum length of a string in characters (Unicode codepoints).
*
* The string is assumed to be encoded as UTF-8.
*
* Failure codes:
* - 'maxchars': The string is too long. Data:
* - 'maxbytes': The maximum number of bytes allowed, or null if no limit
* - 'maxchars': The maximum number of characters allowed, or null if no limit
*/
public const PARAM_MAX_CHARS = 'param-max-chars';
/** @var bool */
protected $allowEmptyWhenRequired = false;
/**
* @param Callbacks $callbacks
* @param array $options Options:
* - allowEmptyWhenRequired: (bool) Whether to reject the empty string when PARAM_REQUIRED.
* Defaults to false.
*/
public function __construct( Callbacks $callbacks, array $options = [] ) {
parent::__construct( $callbacks );
$this->allowEmptyWhenRequired = !empty( $options[ self::OPT_ALLOW_EMPTY ] );
}
public function validate( $name, $value, array $settings, array $options ) {
$allowEmptyWhenRequired = $options[ self::OPT_ALLOW_EMPTY ]
?? $this->allowEmptyWhenRequired;
if ( !$allowEmptyWhenRequired && $value === '' &&
!empty( $settings[ParamValidator::PARAM_REQUIRED] )
) {
$this->failure( 'missingparam', $name, $value, $settings, $options );
}
$this->failIfNotString( $name, $value, $settings, $options );
$len = strlen( $value );
if ( isset( $settings[self::PARAM_MAX_BYTES] ) && $len > $settings[self::PARAM_MAX_BYTES] ) {
$this->failure(
$this->failureMessage( 'maxbytes', [
'maxbytes' => $settings[self::PARAM_MAX_BYTES] ?? null,
'maxchars' => $settings[self::PARAM_MAX_CHARS] ?? null,
] )->numParams( $settings[self::PARAM_MAX_BYTES], $len ),
$name, $value, $settings, $options
);
}
$len = mb_strlen( $value, 'UTF-8' );
if ( isset( $settings[self::PARAM_MAX_CHARS] ) && $len > $settings[self::PARAM_MAX_CHARS] ) {
$this->failure(
$this->failureMessage( 'maxchars', [
'maxbytes' => $settings[self::PARAM_MAX_BYTES] ?? null,
'maxchars' => $settings[self::PARAM_MAX_CHARS] ?? null,
] )->numParams( $settings[self::PARAM_MAX_CHARS], $len ),
$name, $value, $settings, $options
);
}
return $value;
}
public function checkSettings( string $name, $settings, array $options, array $ret ): array {
$ret = parent::checkSettings( $name, $settings, $options, $ret );
$ret['allowedKeys'] = array_merge( $ret['allowedKeys'], [
self::PARAM_MAX_BYTES, self::PARAM_MAX_CHARS,
] );
$maxb = $settings[self::PARAM_MAX_BYTES] ?? PHP_INT_MAX;
if ( !is_int( $maxb ) ) {
$ret['issues'][self::PARAM_MAX_BYTES] = 'PARAM_MAX_BYTES must be an integer, got '
. gettype( $maxb );
} elseif ( $maxb < 0 ) {
$ret['issues'][self::PARAM_MAX_BYTES] = 'PARAM_MAX_BYTES must be greater than or equal to 0';
}
$maxc = $settings[self::PARAM_MAX_CHARS] ?? PHP_INT_MAX;
if ( !is_int( $maxc ) ) {
$ret['issues'][self::PARAM_MAX_CHARS] = 'PARAM_MAX_CHARS must be an integer, got '
. gettype( $maxc );
} elseif ( $maxc < 0 ) {
$ret['issues'][self::PARAM_MAX_CHARS] = 'PARAM_MAX_CHARS must be greater than or equal to 0';
}
if ( !$this->allowEmptyWhenRequired && !empty( $settings[ParamValidator::PARAM_REQUIRED] ) ) {
if ( $maxb === 0 ) {
$ret['issues'][] = 'PARAM_REQUIRED is set, allowEmptyWhenRequired is not set, and '
. 'PARAM_MAX_BYTES is 0. That\'s impossible to satisfy.';
}
if ( $maxc === 0 ) {
$ret['issues'][] = 'PARAM_REQUIRED is set, allowEmptyWhenRequired is not set, and '
. 'PARAM_MAX_CHARS is 0. That\'s impossible to satisfy.';
}
}
return $ret;
}
public function getParamInfo( $name, array $settings, array $options ) {
$info = parent::getParamInfo( $name, $settings, $options );
$info['maxbytes'] = $settings[self::PARAM_MAX_BYTES] ?? null;
$info['maxchars'] = $settings[self::PARAM_MAX_CHARS] ?? null;
return $info;
}
public function getHelpInfo( $name, array $settings, array $options ) {
$info = parent::getHelpInfo( $name, $settings, $options );
if ( isset( $settings[self::PARAM_MAX_BYTES] ) ) {
$info[self::PARAM_MAX_BYTES] = MessageValue::new( 'paramvalidator-help-type-string-maxbytes' )
->numParams( $settings[self::PARAM_MAX_BYTES] );
}
if ( isset( $settings[self::PARAM_MAX_CHARS] ) ) {
$info[self::PARAM_MAX_CHARS] = MessageValue::new( 'paramvalidator-help-type-string-maxchars' )
->numParams( $settings[self::PARAM_MAX_CHARS] );
}
return $info;
}
}

File Metadata

Mime Type
text/x-php
Expires
Sun, Oct 4, 00:28 (2 w, 6 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
63/07/2241e8074d90431aa4c8c74830c1
Default Alt Text
StringDef.php (5 KB)

Event Timeline