Skip to content

Commit

Permalink
feat:minor refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
themisir committed Apr 9, 2021
1 parent a4c5959 commit e52c4e4
Show file tree
Hide file tree
Showing 15 changed files with 148 additions and 140 deletions.
1 change: 0 additions & 1 deletion lib/src/form_validator_locale.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
abstract class FormValidatorLocale {
String name();

String required();
String minLength(String v, int n);
String maxLength(String v, int n);
Expand Down
69 changes: 35 additions & 34 deletions lib/src/i18n/all.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,48 @@ import '../form_validator_locale.dart';
import 'az.dart';
import 'de.dart';
import 'en.dart';
import 'fr.dart';
import 'id.dart';
import 'it.dart';
import 'fr.dart';
import 'pt_br.dart';
import 'tr.dart';
import 'zh_cn.dart';

FormValidatorLocale createLocale(String locale) {
switch (locale) {
case 'az':
return LocaleAz();

case 'de':
return LocaleDe();

case 'fr':
return LocaleFr();
const supportedLocales = <String>{
'az',
'de',
'fr',
'id',
'it',
'tr',
'pt-br',
'pl',
'zh-cn',
'en',
};

const localeMap = <String, FormValidatorLocale>{
'az': LocaleAz(),
'de': LocaleDe(),
'fr': LocaleFr(),
'id': LocaleId(),
'it': LocaleIt(),
'tr': LocaleTr(),
'pt-br': LocalePtBr(),
'pl': LocalePl(),
'zh-cn': LocaleZhCN(),
'en': LocaleEn(),
};

case 'id':
return LocaleId();

case 'it':
return LocaleIt();

case 'tr':
return LocaleTr();

case 'pt-br':
return LocalePtBr();

case 'pl':
return LocalePl();

case 'zh-CN':
return LocaleZhCN();
FormValidatorLocale createLocale(String locale) {
if (locale == 'default') locale = 'en';

case 'en':
case 'default':
return LocaleEn();
final result = localeMap[locale];
if (result != null) return result;

default:
throw ArgumentError.value(locale, 'locale', 'Form validation locale is not available.');
}
throw ArgumentError.value(
locale,
'locale',
'Form validation locale is not yet supported.',
);
}
4 changes: 3 additions & 1 deletion lib/src/i18n/az.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleAz extends FormValidatorLocale {
class LocaleAz implements FormValidatorLocale {
const LocaleAz();

@override
String name() => 'az';

Expand Down
7 changes: 4 additions & 3 deletions lib/src/i18n/de.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleDe extends FormValidatorLocale {
class LocaleDe implements FormValidatorLocale {
const LocaleDe();

@override
String name() => 'de';

Expand All @@ -9,8 +11,7 @@ class LocaleDe extends FormValidatorLocale {
'Es sind mindestens $n Zeichen erforderlich';

@override
String maxLength(String v, int n) =>
'Es sind maximal $n Zeichen erlaubt';
String maxLength(String v, int n) => 'Es sind maximal $n Zeichen erlaubt';

@override
String email(String v) => 'Dies ist keine gültige E-Mail';
Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/en.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleEn extends FormValidatorLocale {
class LocaleEn implements FormValidatorLocale {
const LocaleEn();

@override
String name() => 'en';

Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/fr.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleFr extends FormValidatorLocale {
class LocaleFr implements FormValidatorLocale {
const LocaleFr();

@override
String name() => 'fr';

Expand Down
7 changes: 4 additions & 3 deletions lib/src/i18n/id.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleId extends FormValidatorLocale {
class LocaleId implements FormValidatorLocale {
const LocaleId();

@override
String name() => 'id';

Expand All @@ -9,8 +11,7 @@ class LocaleId extends FormValidatorLocale {
'Masukan harus diisi minimum $n karakter';

@override
String maxLength(String v, int n) =>
'Masukan harus kurang dari $n karakter';
String maxLength(String v, int n) => 'Masukan harus kurang dari $n karakter';

@override
String email(String v) => 'Masukan bukan email yang benar';
Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/it.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleIt extends FormValidatorLocale {
class LocaleIt implements FormValidatorLocale {
const LocaleIt();

@override
String name() => 'it';

Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/pl.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocalePl extends FormValidatorLocale {
class LocalePl implements FormValidatorLocale {
const LocalePl();

@override
String name() => 'pl';

Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/pt_br.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocalePtBr extends FormValidatorLocale {
class LocalePtBr implements FormValidatorLocale {
const LocalePtBr();

@override
String name() => 'pt-br';

Expand Down
4 changes: 3 additions & 1 deletion lib/src/i18n/tr.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import '../form_validator_locale.dart';

class LocaleTr extends FormValidatorLocale {
class LocaleTr implements FormValidatorLocale {
const LocaleTr();

@override
String name() => 'tr';

Expand Down
6 changes: 4 additions & 2 deletions lib/src/i18n/zh_cn.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import '../form_validator_locale.dart';

class LocaleZhCN extends FormValidatorLocale {
class LocaleZhCN implements FormValidatorLocale {
const LocaleZhCN();

@override
String name() => 'zh-CN';
String name() => 'zh-cn';

@override
String minLength(String v, int n) => '此字段必须包含至少$n个字节';
Expand Down
51 changes: 28 additions & 23 deletions lib/src/validator_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,22 @@ class ValidationBuilder {
}

static FormValidatorLocale globalLocale = createLocale('default');

static void setLocale(String localeName) {
globalLocale = createLocale(localeName);
}

static final RegExp _emailRegExp = RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9\-\_]+(\.[a-zA-Z]+)*$");
static final RegExp _nonDigitsExp = RegExp(r'[^\d]');
static final RegExp _anyLetter = RegExp(r'[A-Za-z]');
static final RegExp _phoneRegExp = RegExp(r'^\d{7,15}$');
static final RegExp _ipv4RegExp = RegExp(
r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$');
static final RegExp _ipv6RegExp = RegExp(
r'^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$');
static final RegExp _urlRegExp = RegExp(
r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)');

final bool optional;
final String? requiredMessage;
final FormValidatorLocale _locale;
Expand Down Expand Up @@ -72,11 +83,13 @@ class ValidationBuilder {

/// Throws error only if [left] and [right] validators throw error same time.
/// If [reverse] is true left builder's error will be displayed otherwise
/// right builder's error. Because this is default behaviour on most
/// right builder's error. Because this is default behaviour on most of the
/// programming languages.
ValidationBuilder or(
Action<ValidationBuilder> left, Action<ValidationBuilder> right,
{bool reverse = false}) {
Action<ValidationBuilder> left,
Action<ValidationBuilder> right, {
bool reverse = false,
}) {
// Create
final v1 = ValidationBuilder(locale: _locale);
final v2 = ValidationBuilder(locale: _locale);
Expand Down Expand Up @@ -108,32 +121,24 @@ class ValidationBuilder {
add((v) => (v == null || v == '') ? message ?? _locale.required() : null);

/// Value length must be greater than or equal to [minLength]
ValidationBuilder minLength(int minLength, [String? message]) => add((v) =>
v!.length < minLength ? message ?? _locale.minLength(v, minLength) : null);
ValidationBuilder minLength(int minLength, [String? message]) =>
add((v) => v!.length < minLength
? message ?? _locale.minLength(v, minLength)
: null);

/// Value length must be less than or equal to [maxLength]
ValidationBuilder maxLength(int maxLength, [String? message]) => add((v) =>
v!.length > maxLength ? message ?? _locale.maxLength(v, maxLength) : null);
ValidationBuilder maxLength(int maxLength, [String? message]) =>
add((v) => v!.length > maxLength
? message ?? _locale.maxLength(v, maxLength)
: null);

/// Value must match [regExp]
ValidationBuilder regExp(RegExp regExp, String message) =>
add((v) => regExp.hasMatch(v!) ? null : message);

static final RegExp _emailRegExp = RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9\-\_]+(\.[a-zA-Z]+)*$");
static final RegExp _nonDigitsExp = RegExp(r'[^\d]');
static final RegExp _anyLetter = RegExp(r'[A-Za-z]');
static final RegExp _phoneRegExp = RegExp(r'^\d{7,15}$');
static final RegExp _ipv4RegExp = RegExp(
r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$');
static final RegExp _ipv6RegExp = RegExp(
r'^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$');
static final RegExp _urlRegExp = RegExp(
r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)');

/// Value must be a well formatted email
ValidationBuilder email([String? message]) =>
add((v) => _emailRegExp.hasMatch(v!) ? null : message ?? _locale.email(v));
ValidationBuilder email([String? message]) => add(
(v) => _emailRegExp.hasMatch(v!) ? null : message ?? _locale.email(v));

/// Value must be a well formatted phone number
ValidationBuilder phone([String? message]) =>
Expand All @@ -150,7 +155,7 @@ class ValidationBuilder {
ValidationBuilder ipv6([String? message]) =>
add((v) => _ipv6RegExp.hasMatch(v!) ? null : message ?? _locale.ipv6(v));

/// Value must be a well formatted IPv6 address
/// Value must be a well formatted URL address
ValidationBuilder url([String? message]) =>
add((v) => _urlRegExp.hasMatch(v!) ? null : message ?? _locale.url(v));
}
Loading

0 comments on commit e52c4e4

Please sign in to comment.