or function

LivrRule or(
  1. List<Object?> args,
  2. RuleContext context
)

or: applies the sets of rules one after another until one of them succeeds: {or: ['email', 'positive_integer']}. When all of them fail, the error of the last one is returned.

Implementation

LivrRule or(List<Object?> args, RuleContext context) {
  final ruleSets = List<LivrRule>.generate(
    args.length,
    (i) => context.compileField(args[i]),
    growable: false,
  );

  return (value, allValues) {
    // Rules of a set see the value as the only field of the data
    final data = SingleFieldMap('field', value);
    var result = RuleResult.valid;

    for (var i = 0; i < ruleSets.length; i++) {
      result = ruleSets[i](value, data);
      if (!result.isError) return result;
    }

    // The error of the last set, or valid when there are no sets
    return result;
  };
}