validate method

Validates and parses a number.

Implementation

ValidationResult<NumberValidationIssue, num> validate(String input) {
  final trimmed = input.trim();

  if (trimmed.isEmpty) {
    return const Left(NumberEmptyIssue());
  }

  final parsed = num.tryParse(trimmed);
  if (parsed == null) {
    return const Left(NumberInvalidFormatIssue());
  }

  if (!config.allowNegative && parsed < 0) {
    return Left(NumberNegativeNotAllowedIssue(parsed));
  }

  if (config.integerOnly && parsed != parsed.toInt()) {
    return Left(NumberNotIntegerIssue(parsed));
  }

  if (config.min != null && parsed < config.min!) {
    return Left(
      NumberTooSmallIssue(currentValue: parsed, minValue: config.min!),
    );
  }

  if (config.max != null && parsed > config.max!) {
    return Left(
      NumberTooLargeIssue(currentValue: parsed, maxValue: config.max!),
    );
  }

  if (config.maxDecimalPlaces != null) {
    final decimalPlaces = _countDecimalPlaces(trimmed);
    if (decimalPlaces > config.maxDecimalPlaces!) {
      return Left(
        NumberDecimalPlacesExceededIssue(
          currentPlaces: decimalPlaces,
          maxPlaces: config.maxDecimalPlaces!,
        ),
      );
    }
  }

  return Right(parsed);
}