| 1 | abstract class Validator<T> { |
| 2 | Validator({required this.errorMessage, this.useAdditionalValidation}); |
| 3 | |
| 4 | final String errorMessage; |
| 5 | final bool Function(T)? useAdditionalValidation; |
| 6 | |
| 7 | bool isValid(T? value); |
| 8 | |
| 9 | String? call(T? value) => !isValid(value) ? errorMessage : null; |
| 10 | } |
| 11 | |
| 12 | class TextValidator extends Validator<String> { |
| 13 | TextValidator({ |
| 14 | bool Function(String)? useAdditionalValidation, |
| 15 | this.minLength, |
| 16 | this.maxLength, |
| 17 | this.pattern, |
| 18 | String errorMessage = '', |
| 19 | this.length, |
| 20 | this.isAutovalidate = false, |
| 21 | }) : super(errorMessage: errorMessage, useAdditionalValidation: useAdditionalValidation); |
| 22 | |
| 23 | final int? minLength; |
| 24 | final int? maxLength; |
| 25 | final List<int>? length; |
| 26 | final bool isAutovalidate; |
| 27 | String? pattern; |
| 28 | |
| 29 | @override |
| 30 | bool isValid(String? value) { |
| 31 | if (value == null || value.isEmpty) { |
| 32 | return isAutovalidate ? true : false; |
| 33 | } |
| 34 | |
| 35 | final greaterThanOrEqualToMinLength = value.length >= (minLength ?? 0); |
| 36 | if (!greaterThanOrEqualToMinLength) return false; |
| 37 | |
| 38 | final lengthMatched = length?.contains(value.length) ?? true; |
| 39 | if (!lengthMatched) return false; |
| 40 | |
| 41 | final lowerThanMaxLength = (maxLength ?? 0) > 0 ? (value.length <= maxLength!) : true; |
| 42 | if (!lowerThanMaxLength) return false; |
| 43 | |
| 44 | if (pattern == null) return true; |
| 45 | |
| 46 | final valueMatched = match(value); |
| 47 | final valueValidated = useAdditionalValidation != null |
| 48 | ? useAdditionalValidation!(value) || valueMatched |
| 49 | : valueMatched; |
| 50 | |
| 51 | return valueValidated; |
| 52 | } |
| 53 | |
| 54 | bool match(String value) => pattern != null ? RegExp(pattern!).hasMatch(value) : false; |
| 55 | } |