70 public function validate( $name, $value, array $settings, array $options ) {
73 if ( in_array( $value, $values,
true ) ) {
75 if ( empty( $options[
'is-default'] ) &&
76 isset( $settings[self::PARAM_DEPRECATED_VALUES][$value] )
80 $message = DataMessageValue::new(
89 $this->
failure( $message, $name, $value, $settings, $options,
false );
95 $isMulti = isset( $options[
'values-list'] );
97 $this->
failureMessage(
'badvalue', [], $isMulti ?
'enummulti' :
'enumnotmulti' )
98 ->textListParams( array_map(
99 static fn ( $v ) =>
new ScalarParam( ParamType::PLAINTEXT, $v ),
102 ->numParams( count( $values ) ),
103 $name, $value, $settings, $options
107 private const DISCOURAGED_VALUE_INFO = [
110 'name' =>
'PARAM_DEPRECATED_VALUES',
111 'info' =>
'deprecatedvalues',
112 'canBeMessage' =>
true,
113 'allowedValues' => [
null, true ],
117 'name' =>
'PARAM_INTERNAL_VALUES',
118 'info' =>
'internalvalues',
119 'canBeMessage' =>
false,
120 'allowedValues' => [
false, true ],
125 public function checkSettings(
string $name, $settings, array $options, array $ret ): array {
126 $ret = parent::
checkSettings( $name, $settings, $options, $ret );
128 foreach ( self::DISCOURAGED_VALUE_INFO as $vinfo ) {
129 $ret[
'allowedKeys'][] = $vinfo[
'param'];
131 $dv = $settings[$vinfo[
'param']] ?? [];
132 if ( !is_array( $dv ) ) {
133 $ret[
'issues'][$vinfo[
'param']] =
"{$vinfo['name']} must be an array, got "
136 $values = array_map(
function ( $v ) use ( $name, $settings, $options ) {
139 foreach ( $dv as $k => $v ) {
141 if ( !in_array( $k, $values,
true ) ) {
142 $ret[
'issues'][] =
"{$vinfo['name']} contains \"{$k}\", which is not "
143 .
'one of the enumerated values';
144 } elseif ( $vinfo[
'canBeMessage'] && $v instanceof
MessageValue ) {
145 $ret[
'messages'][] = $v;
146 } elseif ( !in_array( $v, $vinfo[
'allowedValues'],
true ) ) {
147 $type = get_debug_type( $v );
148 $ret[
'issues'][] =
"Values in {$vinfo['name']} has bad type for \"{$k}\": {$type}";
163 public function stringifyValue( $name, $value, array $settings, array $options ) {
164 if ( !is_array( $value ) ) {
165 return parent::stringifyValue( $name, $value, $settings, $options );
172 public function getParamInfo( $name, array $settings, array $options ) {
173 $info = parent::getParamInfo( $name, $settings, $options );
175 $info[
'type'] = $this->sortEnumValues(
182 foreach ( self::DISCOURAGED_VALUE_INFO as $vinfo ) {
183 if ( !empty( $settings[$vinfo[
'param']] ) ) {
184 $badValues = array_intersect(
185 array_keys( $settings[$vinfo[
'param']] ),
189 $badValues = $this->sortEnumValues( $name, $badValues, $settings, $options );
190 $info[$vinfo[
'info']] = array_values( $badValues );
199 public function getHelpInfo( $name, array $settings, array $options ) {
200 $info = parent::getHelpInfo( $name, $settings, $options );
204 $values = $this->getEnumValuesForHelp( $name, $settings, $options );
205 $count = count( $values );
207 $i = array_search(
'', $values,
true );
208 if ( $i ===
false ) {
209 $valuesParam =
new ListParam( ListType::COMMA, $values );
211 unset( $values[$i] );
212 $valuesParam = MessageValue::new(
'paramvalidator-help-type-enum-can-be-empty' )
213 ->commaListParams( $values )
214 ->numParams( count( $values ) );
218 ->params( $isMulti ? 2 : 1 )
219 ->params( $valuesParam )
220 ->numParams( $count );
238 string $name, array $values, array $settings, array $options
242 foreach ( $values as $k => $value ) {
244 if ( isset( $settings[self::PARAM_DEPRECATED_VALUES][$value] ) ) {
249 array_multisort( $flags, $values, SORT_NATURAL );
263 $values = $this->getEnumValues( $name, $settings, $options );
264 $values = $this->sortEnumValues( $name, $values, $settings, $options );