parseOn method

  1. @override
Result<SeparatedList<R, S>> parseOn(
  1. Context context
)
override

Primitive method doing the actual parsing.

The method is overridden in concrete subclasses to implement the parser specific logic. The methods takes a parse context and returns the resulting context, which is either a Success or Failure context.

Implementation

@override
Result<SeparatedList<R, S>> parseOn(Context context) {
  var current = context;
  final elements = <R>[];
  final separators = <S>[];
  while (elements.length < min) {
    if (elements.isNotEmpty) {
      final separation = separator.parseOn(current);
      if (separation.isFailure) {
        return separation.failure(separation.message);
      }
      current = separation;
      separators.add(separation.value);
    }
    final result = delegate.parseOn(current);
    if (result.isFailure) {
      return result.failure(result.message);
    }
    current = result;
    elements.add(result.value);
  }
  while (elements.length < max) {
    final previous = current;
    if (elements.isNotEmpty) {
      final separation = separator.parseOn(current);
      if (separation.isFailure) {
        return current.success(SeparatedList(elements, separators));
      }
      current = separation;
      separators.add(separation.value);
    }
    final result = delegate.parseOn(current);
    if (result.isFailure) {
      if (elements.isNotEmpty) separators.removeLast();
      return previous.success(SeparatedList(elements, separators));
    }
    current = result;
    elements.add(result.value);
  }
  return current.success(SeparatedList(elements, separators));
}