| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Ionizer\Filter;
 
 use ParagonIE\Ionizer\InputFilter;
 use ParagonIE\Ionizer\InvalidDataException;
 
 /**
 * Class AllowList
 * @package ParagonIE\Ionizer\Filter
 */
 class AllowList extends InputFilter
 {
 /**
 * @var array<int, mixed>
 */
 protected $allowedValues = [];
 
 /**
 * AllowList constructor.
 * @param scalar ...$values
 */
 public function __construct(...$values)
 {
 $this->addToWhiteList(...$values);
 }
 
 /**
 * @param array<int, scalar> $values
 * @return self
 */
 protected function addToWhiteList(...$values)
 {
 switch ($this->type) {
 case 'bool':
 /**
 * @var array<int, bool> $values
 * @var bool $val
 */
 foreach ($values as $val) {
 $this->allowedValues []= (bool) $val;
 }
 break;
 case 'float':
 /**
 * @var array<int, float> $values
 * @var float $val
 */
 foreach ($values as $val) {
 $this->allowedValues []= (float) $val;
 }
 break;
 case 'int':
 /**
 * @var array<int, int> $values
 * @var int $val
 */
 foreach ($values as $val) {
 $this->allowedValues []= (int) $val;
 }
 break;
 case 'string':
 /**
 * @var array<int, string> $values
 * @var string $val
 */
 foreach ($values as $val) {
 $this->allowedValues []= (string) $val;
 }
 break;
 default:
 /**
 * @var array<int, string> $values
 * @var string $val
 */
 foreach ($values as $val) {
 $this->allowedValues []= $val;
 }
 }
 return $this;
 }
 
 /**
 * Process data using the filter rules.
 *
 * @param mixed $data
 * @return mixed
 * @throws \TypeError
 * @throws InvalidDataException
 */
 public function process($data = null)
 {
 if (!empty($this->allowedValues)) {
 if (!\in_array($data, $this->allowedValues, true)) {
 $data = null;
 }
 }
 
 /** @var string|int|float|bool|null $data */
 $data = $this->applyCallbacks($data, 0);
 if ($data === null) {
 /** @var string|int|float|bool|null $data */
 $data = $this->default;
 }
 
 // For type strictness:
 switch ($this->type) {
 case 'bool':
 /** @var bool $data */
 return (bool) $data;
 case 'float':
 /** @var float $data */
 return (float) $data;
 case 'int':
 /** @var int $data */
 return (int) $data;
 case 'string':
 /** @var string $data */
 return (string) $data;
 default:
 return $data;
 }
 }
 }
 
 |