respect-validation/library/Rules/ContainsAny.php
Henrique Moody c04034c2a4
Update the validation engine of composite-based rules
This change will also make the composite-based rules require at least
two rules in their constructor because those rules do not make sense
with only one rule.

Signed-off-by: Henrique Moody <henriquemoody@gmail.com>
2024-02-23 00:56:30 +01:00

56 lines
1.5 KiB
PHP

<?php
/*
* Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
* SPDX-License-Identifier: MIT
*/
declare(strict_types=1);
namespace Respect\Validation\Rules;
use Respect\Validation\Exceptions\InvalidRuleConstructorException;
use Respect\Validation\Message\Template;
use function array_map;
use function count;
#[Template(
'{{name}} must contain at least one of the values {{needles}}',
'{{name}} must not contain any of the values {{needles}}',
)]
final class ContainsAny extends Envelope
{
/**
* @param non-empty-array<mixed> $needles At least one of the values provided must be found in input string or array
* @param bool $identical Defines whether the value should be compared strictly, when validating array
*/
public function __construct(array $needles, bool $identical = false)
{
// @phpstan-ignore-next-line
if (empty($needles)) {
throw new InvalidRuleConstructorException('At least one value must be provided');
}
$rules = $this->getRules($needles, $identical);
parent::__construct(
count($rules) === 1 ? $rules[0] : new AnyOf(...$rules),
['needles' => $needles]
);
}
/**
* @param mixed[] $needles
*
* @return Contains[]
*/
private function getRules(array $needles, bool $identical): array
{
return array_map(
static function ($needle) use ($identical): Contains {
return new Contains($needle, $identical);
},
$needles
);
}
}