Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/main/lib/Validation/Validator/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/main/lib/Validation/Validator/LengthValidator.php

<?php

declare(strict_types=1);

namespace Bitrix\Main\Validation\Validator;

use Bitrix\Main\ArgumentException;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Validation\ValidationError;
use Bitrix\Main\Validation\ValidationResult;

class LengthValidator implements ValidatorInterface
{
	/**
	 * @throws ArgumentException
	 */
	public function __construct(
		private readonly ?int $min = null,
		private readonly ?int $max = null
	)
	{
		if (null === $this->min && null === $this->max)
		{
			throw new ArgumentException(Loc::getMessage('MAIN_VALIDATION_LENGTH_INVALID_ARGUMENT'));
		}
	}

	public function validate(mixed $value): ValidationResult
	{
		$result = new ValidationResult();

		if (!is_string($value))
		{
			$result->addError(new ValidationError(
				Loc::getMessage('MAIN_VALIDATION_LENGTH_INVALID_ARGUMENT'),
				failedValidator: $this
			));

			return $result;
		}

		$length = mb_strlen($value);

		if (null !== $this->min)
		{
			$result = $this->checkMin($length);
		}

		if (null !== $this->max && $result->isSuccess())
		{
			$result = $this->checkMax($length);
		}

		return $result;
	}

	private function checkMin(int $length): ValidationResult
	{
		$result = new ValidationResult();

		if ($length < $this->min)
		{
			$result->addError(new ValidationError(
				Loc::getMessagePlural('MAIN_VALIDATION_LENGTH_INVALID_MIN', $this->min, ['#MIN#' => $this->min]),
				failedValidator: $this
			));
		}

		return $result;
	}

	private function checkMax(int $length): ValidationResult
	{
		$result = new ValidationResult();

		if ($length > $this->max)
		{
			$result->addError(new ValidationError(
				Loc::getMessagePlural('MAIN_VALIDATION_LENGTH_INVALID_MAX', $this->max, ['#MAX#' => $this->max])
				, failedValidator: $this
			));
		}

		return $result;
	}
}