parseAsync method

  1. @override
AsyncResult<String> parseAsync(
  1. State<ChunkedData<StringReader>> state
)
override

Experimental. Not yet fully implemented

Implementation

@override
AsyncResult<String> parseAsync(State<ChunkedData<StringReader>> state) {
  final result = AsyncResult<String>();
  if (!backtrack(state)) {
    result.ok = false;
    return result;
  }

  final input = state.input;
  final start = input.start;
  input.buffering++;

  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.buffering--;
    result.value = const Result('');
    result.ok = true;
    input.handler = result.handler;
    return result;
  }

  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.handler = parse;
      return;
    }

    input.buffering--;
    result.value = const Result('');
    result.ok = true;
    input.handler = result.handler;
  }

  parse();
  return result;
}