listEach function

IValidator listEach(
  1. IValidator itemValidator, {
  2. String? message,
})

Returns a Validator that runs itemValidator for each item in the list

This validator also checks that the value is a list

Implementation

IValidator listEach(IValidator itemValidator, {String? message}) {
  FutureOr<Result> listEachPredicate(value) {
    final errors = <Expectation>[];

    FutureOr<Result> loop(int index) {
      if (index >= value.length) {
        return errors.isEmpty
            ? Result.valid(value)
            : Result.invalid(value, expectations: errors);
      }

      final item = value[index];

      if (item == null && itemValidator.isNullable) {
        return loop(index + 1);
      }

      final res = itemValidator.validator(item);

      if (res is Future<Result>) {
        return res.then((r) {
          _collectListIndex(r, errors, index, message);
          return loop(index + 1);
        });
      }

      _collectListIndex(res, errors, index, message);

      return loop(index + 1);
    }

    return loop(0);
  }

  return $isList & Validator(listEachPredicate);
}