query method

  1. @override
Future<String?> query(
  1. String query, {
  2. Duration timeout = const Duration(seconds: 2),
})
override

Queries the terminal for information by writing query and waiting for a response.

Returns the response string, or null if the query timed out.

This is intended for non-TUI use cases. In a TUI, use the message loop.

Implementation

@override
Future<String?> query(
  String query, {
  Duration timeout = const Duration(seconds: 2),
}) async {
  final wasRaw = _rawModeEnabled;
  if (!wasRaw) enableRawMode();

  try {
    write(query);
    await flush();

    final completer = Completer<String?>();
    final buffer = StringBuffer();

    final timer = Timer(timeout, () {
      if (!completer.isCompleted) completer.complete(null);
    });

    final sub = input.listen((data) {
      buffer.write(String.fromCharCodes(data));
      final s = buffer.toString();

      if (s.contains('\x07') || s.contains('\x1b\\') || s.endsWith('c')) {
        if (!completer.isCompleted) completer.complete(s);
      }
    });

    final result = await completer.future;
    timer.cancel();
    await sub.cancel();
    return result;
  } finally {
    if (!wasRaw) disableRawMode();
  }
}