Skip to content

Range Validator

range_validator

Validator for numeric value ranges.

RangeValidator

Bases: ValidationRule

Validates that a numeric value falls within a [minimum, maximum] range.

Source code in src/forging_blocks/domain/validators/range_validator.py
class RangeValidator(ValidationRule):
    """Validates that a numeric value falls within a ``[minimum, maximum]`` range."""

    def __init__(
        self,
        field: str,
        minimum_value: int | float | None = None,
        maximum_value: int | float | None = None,
    ) -> None:
        self._field = field
        self._minimum_value = minimum_value
        self._maximum_value = maximum_value

    def validate(self, value: Any) -> list[RuleViolationError]:
        if not isinstance(value, (int, float)):
            return [
                RuleViolationError(
                    ErrorMessage(f"'{self._field}' must be a number."),
                    ErrorMetadata(context={"field": self._field, "code": "invalid_type"}),
                )
            ]

        errors: list[RuleViolationError] = []

        if self._minimum_value is not None and value < self._minimum_value:
            errors.append(
                RuleViolationError(
                    ErrorMessage(f"'{self._field}' must be at least {self._minimum_value}."),
                    ErrorMetadata(context={"field": self._field, "code": "minimum_value"}),
                )
            )

        if self._maximum_value is not None and value > self._maximum_value:
            errors.append(
                RuleViolationError(
                    ErrorMessage(f"'{self._field}' must be at most {self._maximum_value}."),
                    ErrorMetadata(context={"field": self._field, "code": "maximum_value"}),
                )
            )

        return errors