validate method

  1. @override
Map<String, dynamic>? validate(
  1. AbstractControl control
)
override

Validates the control.

Implementation

@override
Map<String, dynamic>? validate(AbstractControl<dynamic> control) {
  if (control is! FormGroup) {
    // Maybe throw an exception is better
    return <String, dynamic>{ValidationMessage.compare: true};
  }

  final mainControl = control.control(controlName);
  final compareControl = control.control(compareControlName);
  final error = {
    ValidationMessage.compare: <String, dynamic>{
      'control': mainControl.value,
      'compareControl': compareControl.value,
      'option': compareOption,
    }
  };

  if (compareOption == CompareOption.equal &&
      mainControl.isNull &&
      compareControl.isNull) {
    return null;
  } else if (mainControl.isNull || compareControl.isNull) {
    mainControl.setErrors(error);
    return null;
  } else if (mainControl.value is! Comparable<dynamic>) {
    throw ValidatorException(
        'Control "$controlName" must be of type "Comparable"');
  }

  try {
    final meetsComparison = _meetsComparison(
      mainControl.value as Comparable<dynamic>,
      compareControl.value,
    );

    if (meetsComparison) {
      mainControl.removeError(ValidationMessage.compare);
    } else {
      mainControl.setErrors(error);
      mainControl.markAsTouched();
    }

    return null;
  } on TypeError {
    throw ValidatorException(
        'Can\'t compare control "$controlName" of type "${mainControl.value.runtimeType}" with the control "$compareControlName" of type ${compareControl.value.runtimeType}');
  }
}