* SPDX-FileContributor: Danilo Benevides * SPDX-FileContributor: Graham Campbell * SPDX-FileContributor: Henrique Moody * SPDX-FileContributor: Marcelo Araujo * SPDX-FileContributor: Nick Lombard */ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; use Respect\Dev\CodeGen\Attributes\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; use function in_array; use function is_array; use function mb_strpos; #[Mixin(include: ['length', 'max', 'min'])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template( '{{subject}} must be in {{haystack}}', '{{subject}} must not be in {{haystack}}', )] final readonly class In implements Validator { public function __construct( private mixed $haystack, ) { } public function evaluate(mixed $input): Result { $parameters = ['haystack' => $this->haystack]; return Result::of($this->validate($input), $input, $this, $parameters); } private function validate(mixed $input): bool { if (is_array($this->haystack)) { return in_array($input, $this->haystack, strict: true); } if ($input === null || $input === '') { return $input === $this->haystack; } return mb_strpos($this->haystack, (string) $input) !== false; } }