run method

  1. @override
Future<ProcessResult> run(
  1. String executable,
  2. List<String> arguments, {
  3. String? workingDirectory,
  4. void onStdout(
    1. String line
    )?,
  5. void onStderr(
    1. String line
    )?,
  6. Map<String, String>? environment,
})
override

Executes executable with arguments in workingDirectory. Optionally streams stdout/stderr lines to onStdout and onStderr.

Implementation

@override
Future<ProcessResult> run(
  String executable,
  List<String> arguments, {
  String? workingDirectory,
  void Function(String line)? onStdout,
  void Function(String line)? onStderr,
  Map<String, String>? environment,
}) async {
  if (onStdout == null && onStderr == null) {
    return Process.run(
      executable,
      arguments,
      workingDirectory: workingDirectory,
      environment: environment,
    );
  }

  final process = await Process.start(
    executable,
    arguments,
    workingDirectory: workingDirectory,
    environment: environment,
  );

  final stdoutBuf = StringBuffer();
  final stderrBuf = StringBuffer();

  final stdoutFuture = process.stdout
      .transform(const Utf8Decoder(allowMalformed: true))
      .transform(const LineSplitter())
      .listen((line) {
    stdoutBuf.writeln(line);
    onStdout?.call(line);
  }).asFuture<void>();

  final stderrFuture = process.stderr
      .transform(const Utf8Decoder(allowMalformed: true))
      .transform(const LineSplitter())
      .listen((line) {
    stderrBuf.writeln(line);
    onStderr?.call(line);
  }).asFuture<void>();

  final exitCode = await process.exitCode;
  await Future.wait([stdoutFuture, stderrFuture]);

  return ProcessResult(
    process.pid,
    exitCode,
    stdoutBuf.toString(),
    stderrBuf.toString(),
  );
}