readLine method
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;
}
}