runPiped method
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,
);
}