parseAsync method

  1. @override
AsyncResult<Object?> parseAsync(
  1. State<ChunkedData<I>> state
)
override

Experimental. Not yet fully implemented

Implementation

@override
AsyncResult<Object?> parseAsync(State<ChunkedData<I>> state) {
  final result = AsyncResult<Object?>();
  final input = state.input;
  final pos = state.pos;
  late AsyncResult<O1> r1;
  late AsyncResult<O2> r2;
  late AsyncResult<O3> r3;
  late AsyncResult<O4> r4;
  var action = 0;
  void parse() {
    while (true) {
      switch (action) {
        case 0:
          r1 = p1.parseAsync(state);
          action = 1;
          if (r1.ok == null) {
            r1.handler = parse;
            return;
          }

          break;
        case 1:
          if (r1.ok == false) {
            result.ok = false;
            input.handler = result.handler;
            return;
          }

          r2 = p2.parseAsync(state);
          action = 2;
          if (r2.ok == null) {
            r2.handler = parse;
            return;
          }

          break;
        case 2:
          if (r2.ok == false) {
            state.pos = pos;
            result.ok = false;
            input.handler = result.handler;
            return;
          }

          r3 = p3.parseAsync(state);
          action = 3;
          if (r3.ok == null) {
            r3.handler = parse;
            return;
          }

          break;
        case 3:
          if (r3.ok == false) {
            state.pos = pos;
            result.ok = false;
            input.handler = result.handler;
            return;
          }

          r4 = p4.parseAsync(state);
          action = 4;
          if (r4.ok == null) {
            r4.handler = parse;
            return;
          }

          break;
        case 4:
          if ((result.ok = r4.ok) == false) {
            state.pos = pos;
          } else {
            result.value = const Result<Object?>(null);
          }

          input.handler = result.handler;
          action = -1;
          return;
        default:
          throw StateError('Invalid state: $action');
      }
    }
  }

  parse();
  return result;
}