parseOn method

  1. @override
Result<List<R>> 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<List<R>> parseOn(Context context) {
  var current = context;
  final elements = <R>[];
  while (elements.length < min) {
    final result = delegate.parseOn(current);
    if (result.isFailure) {
      return result.failure(result.message);
    }
    elements.add(result.value);
    current = result;
  }
  final contexts = <Context>[current];
  while (elements.length < max) {
    final result = delegate.parseOn(current);
    if (result.isFailure) {
      break;
    }
    elements.add(result.value);
    contexts.add(current = result);
  }
  for (;;) {
    final limiter = limit.parseOn(contexts.last);
    if (limiter.isSuccess) {
      return contexts.last.success(elements);
    }
    if (elements.isEmpty) {
      return limiter.failure(limiter.message);
    }
    contexts.removeLast();
    elements.removeLast();
    if (contexts.isEmpty) {
      return limiter.failure(limiter.message);
    }
  }
}