validate static method

String? validate(
  1. dynamic dob, {
  2. String format = "yyyy-MM-dd",
  3. int minAgeYears = 18,
  4. int maxAgeYears = 120,
  5. int? minAgeDays,
  6. bool useUtc = false,
  7. String? invalidFormatMessage,
  8. String? futureDateMessage,
  9. String? tooYoungMessage,
  10. String? tooOldMessage,
  11. SahihLanguage? lang,
})

Validates a date of birth string or DateTime and returns an error message if invalid.

dob can be either a String in the given format or a DateTime object. format is only used if dob is a String (default: "yyyy-MM-dd"). minAgeYears is the minimum allowed age (default: 18 years). maxAgeYears is the maximum allowed age (default: 120 years). minAgeDays can be set if you want to enforce a specific minimum age in days. useUtc decides whether to calculate using UTC time (default: false). Custom error messages can be provided for each validation rule.

Implementation

static String? validate(
  dynamic dob, {
  String format = "yyyy-MM-dd",
  int minAgeYears = 18,
  int maxAgeYears = 120,
  int? minAgeDays,
  bool useUtc = false,

  // Custom error messages
  String? invalidFormatMessage,
  String? futureDateMessage,
  String? tooYoungMessage,
  String? tooOldMessage,
  SahihLanguage? lang,
}) {
  try {
    DateTime birthDate;

    if (dob is String) {
      DateFormat formatter = DateFormat(format);
      birthDate = formatter.parseStrict(dob);
    } else if (dob is DateTime) {
      birthDate = dob;
    } else {
      return invalidFormatMessage ??
          SahihLocalization.get('dob_invalid',
              lang: lang, args: {'format': format});
    }

    DateTime today = useUtc ? DateTime.now().toUtc() : DateTime.now();

    if (birthDate.isAfter(today)) {
      return futureDateMessage ??
          SahihLocalization.get('dob_future', lang: lang);
    }

    AgeResult age = _calculateExactAge(birthDate, today);

    if (age.years < minAgeYears ||
        (minAgeDays != null && _ageInDays(age) < minAgeDays)) {
      return tooYoungMessage ??
          SahihLocalization.get('dob_too_young', lang: lang, args: {
            'min': minAgeYears.toString(),
            'age': age.years.toString()
          });
    }

    if (age.years > maxAgeYears) {
      return tooOldMessage ??
          SahihLocalization.get('dob_too_old',
              lang: lang, args: {'max': maxAgeYears.toString()});
    }

    return null; // Valid
  } catch (_) {
    return invalidFormatMessage ??
        SahihLocalization.get('dob_invalid',
            lang: lang, args: {'format': format});
  }
}