parseAsync method

  1. @override
void parseAsync(
  1. State<ChunkedData<StringReader>> state,
  2. ResultCallback<String> onDone
)
override

Implementation

@override
void parseAsync(
    State<ChunkedData<StringReader>> state, ResultCallback<String> onDone) {
  if (!backtrack(state)) {
    onDone(null);
    return;
  }

  final input = state.input;
  final start = input.start;
  final pos = state.pos;
  input.buffering++;
  void parse() {
    final data = input.data;
    final source = data.source!;
    final end = input.end;
    var ok = true;
    int? c;
    while (state.pos < end) {
      c = source.runeAt(state.pos - start);
      if (!f(c)) {
        ok = false;
        break;
      }

      state.pos += c > 0xffff ? 2 : 1;
    }

    if (ok && !input.isClosed) {
      input.sleep = true;
      input.handle(parse);
      return;
    }

    input.buffering--;
    if (state.pos != pos) {
      onDone(const Result(''));
    } else {
      state.fail<Object?>(ErrorUnexpectedCharacter(c));
      state.pos = pos;
      onDone(null);
    }
  }

  parse();
}