validate method

Validates and normalizes an email.

Implementation

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

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

  if (trimmed.length > config.maxLength) {
    return Left(
      EmailTooLongIssue(
        currentLength: trimmed.length,
        maxLength: config.maxLength,
      ),
    );
  }

  if (!emailReg.hasMatch(trimmed)) {
    return const Left(EmailInvalidFormatIssue());
  }

  final parts = trimmed.split('@');
  if (parts.length != 2) {
    return const Left(EmailInvalidFormatIssue());
  }

  final localPart = parts[0];
  final domain = parts[1];

  if (localPart.length > config.maxLocalPartLength) {
    return Left(
      EmailLocalPartTooLongIssue(
        currentLength: localPart.length,
        maxLength: config.maxLocalPartLength,
      ),
    );
  }

  if (domain.length > config.maxDomainLength) {
    return Left(
      EmailDomainTooLongIssue(
        currentLength: domain.length,
        maxLength: config.maxDomainLength,
      ),
    );
  }

  final lowerDomain = domain.toLowerCase();

  if (config.blockedDomains.contains(lowerDomain)) {
    return Left(EmailBlockedDomainIssue(lowerDomain));
  }

  if (!config.allowDisposable &&
      config.disposableDomains.contains(lowerDomain)) {
    return Left(EmailDisposableDomainIssue(lowerDomain));
  }

  return Right(trimmed.toLowerCase());
}