dev
dart 55 lines 1.57 KB
Raw
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 }