runPiped method

Future<ProcessOutput> runPiped(
  1. List<ProcessConfig> configs
)

Pipe stdout of each process into stdin of the next.

Implementation

Future<ProcessOutput> runPiped(List<ProcessConfig> configs) async {
  if (configs.isEmpty) {
    return ProcessOutput(exitCode: 0, duration: Duration.zero, pid: 0);
  }
  if (configs.length == 1) return run(configs.first);

  final sw = Stopwatch()..start();
  var input = '';

  // If the first config has stdin, use it
  if (configs.first.stdin != null) {
    input = configs.first.stdin!;
  }

  ProcessOutput? lastOutput;
  for (var i = 0; i < configs.length; i++) {
    final cfg = ProcessConfig(
      command: configs[i].command,
      args: configs[i].args,
      workDir: configs[i].workDir,
      env: configs[i].env,
      timeout: configs[i].timeout,
      stdin: i == 0 ? configs[i].stdin : input,
      captureStdout: true,
      captureStderr: configs[i].captureStderr,
      runInShell: configs[i].runInShell,
    );
    lastOutput = await run(cfg);
    if (lastOutput.exitCode != 0) {
      sw.stop();
      return ProcessOutput(
        exitCode: lastOutput.exitCode,
        stdout: lastOutput.stdout,
        stderr: lastOutput.stderr,
        duration: sw.elapsed,
        pid: lastOutput.pid,
        killed: lastOutput.killed,
      );
    }
    input = lastOutput.stdout;
  }
  sw.stop();

  return ProcessOutput(
    exitCode: lastOutput!.exitCode,
    stdout: lastOutput.stdout,
    stderr: lastOutput.stderr,
    duration: sw.elapsed,
    pid: lastOutput.pid,
  );
}