readLine method

Future<String?> readLine({
  1. String prompt = '',
})

Reads one edited line.

Returns null when input ends, Ctrl-D is pressed on an empty line, or the line is cancelled with Ctrl-C.

Implementation

Future<String?> readLine({String prompt = ''}) async {
  if (_closed) {
    throw StateError('Readline is closed.');
  }
  if (_reading) {
    throw StateError('Readline is already reading.');
  }

  _reading = true;
  final buffer = LineBuffer();
  final renderer = LineRenderer(
    output: _output,
    prompt: prompt,
    terminalColumns: _terminalColumns,
  );

  try {
    _terminalMode?.enterRawMode();
    renderer.render(buffer);
    await _flushOutput();

    while (true) {
      final input = await _input.next();
      if (input == null) {
        renderer.finishLine();
        if (buffer.isEmpty) return null;
        final line = buffer.text;
        _history.add(line);
        return line;
      }

      switch (input) {
        case ReadlineTextInput(:final text):
          buffer.insert(text);
          _history.resetNavigation();
          renderer.render(buffer);
        case ReadlineKeyInput(:final event):
          final action = _handleKey(event, buffer, renderer);
          switch (action) {
            case _ReadlineContinue():
              break;
            case _ReadlineSubmit(:final line):
              _history.add(line);
              return line;
            case _ReadlineCancel():
              return null;
          }
      }

      await _flushOutput();
    }
  } finally {
    _terminalMode?.restore();
    await _flushOutput();
    _reading = false;
  }
}