validate static method
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});
}
}