runStreamingInspected function

Future<({int exitCode, bool hadWarnings})> runStreamingInspected(
  1. String executable,
  2. List<String> args, {
  3. String? workingDirectory,
  4. bool headless = false,
  5. bool scanWarnings = false,
})

Like runStreaming but:

  • strips ANSI escape sequences from subprocess output when headless is true
  • scans each line for [WARNING] patterns when scanWarnings is true

Returns a record (exitCode, hadWarnings).

Implementation

Future<({int exitCode, bool hadWarnings})> runStreamingInspected(
  String executable,
  List<String> args, {
  String? workingDirectory,
  bool headless = false,
  bool scanWarnings = false,
}) async {
  final process = await Process.start(executable, args, workingDirectory: workingDirectory);

  StreamSubscription? sigintSub;
  StreamSubscription? sigtermSub;
  if (!Platform.isWindows) {
    sigintSub = ProcessSignal.sigint.watch().listen((_) {
      process.kill(ProcessSignal.sigint);
      exit(130);
    });
    sigtermSub = ProcessSignal.sigterm.watch().listen((_) {
      process.kill(ProcessSignal.sigterm);
      exit(143);
    });
  }

  var hadWarnings = false;

  void handleLine(String line) {
    if (scanWarnings && line.contains('[WARNING]')) hadWarnings = true;
    stdout.writeln(headless ? stripAnsi(line) : line);
  }

  await Future.wait([
    process.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen(handleLine).asFuture<void>(),
    process.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen(handleLine).asFuture<void>(),
  ]);

  await sigintSub?.cancel();
  await sigtermSub?.cancel();

  return (exitCode: await process.exitCode, hadWarnings: hadWarnings);
}