blob: 51bc6a986eaa70de97785594768e1aa42e102efa [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io' show ProcessException;
/// A specialized exception class for this package, so that it can throw
/// customized exceptions with more information.
class ProcessPackageException extends ProcessException {
/// Create a const ProcessPackageException.
///
/// The [executable] should be the name of the executable to be run.
///
/// The optional [workingDirectory] is the directory where the command
/// execution is attempted.
///
/// The optional [arguments] is a list of the arguments to given to the
/// executable, already separated.
///
/// The optional [message] is an additional message to be included in the
/// exception string when printed.
///
/// The optional [errorCode] is the error code received when the executable
/// was run. Zero means it ran successfully, or that no error code was
/// available.
///
/// See [ProcessException] for more information.
const ProcessPackageException(
String executable, {
List<String> arguments = const <String>[],
String message = '',
int errorCode = 0,
this.workingDirectory,
}) : super(executable, arguments, message, errorCode);
/// Creates a [ProcessPackageException] from a [ProcessException].
factory ProcessPackageException.fromProcessException(
ProcessException exception, {
String? workingDirectory,
}) {
return ProcessPackageException(
exception.executable,
arguments: exception.arguments,
message: exception.message,
errorCode: exception.errorCode,
workingDirectory: workingDirectory,
);
}
/// The optional working directory that the command was being executed in.
final String? workingDirectory;
// Don't implement a toString() for this exception, since code may be
// depending upon the format of ProcessException.toString().
}
/// An exception for when an executable is not found that was expected to be found.
class ProcessPackageExecutableNotFoundException
extends ProcessPackageException {
/// Creates a const ProcessPackageExecutableNotFoundException
///
/// The optional [candidates] are the files matching the expected executable
/// on the [searchPath].
///
/// The optional [searchPath] is the list of directories searched for the
/// expected executable.
///
/// See [ProcessPackageException] for more information.
const ProcessPackageExecutableNotFoundException(
super.executable, {
super.arguments,
super.message,
super.errorCode,
super.workingDirectory,
this.candidates = const <String>[],
this.searchPath = const <String>[],
});
/// The list of non-viable executable candidates found.
final List<String> candidates;
/// The search path used to find candidates.
final List<String> searchPath;
@override
String toString() {
final StringBuffer buffer =
StringBuffer('ProcessPackageExecutableNotFoundException: $message\n');
// Don't add an extra space if there are no arguments.
final String args = arguments.isNotEmpty ? ' ${arguments.join(' ')}' : '';
buffer.writeln(' Command: $executable$args');
if (workingDirectory != null && workingDirectory!.isNotEmpty) {
buffer.writeln(' Working Directory: $workingDirectory');
}
if (candidates.isNotEmpty) {
buffer.writeln(' Candidates:\n ${candidates.join('\n ')}');
}
buffer.writeln(' Search Path:\n ${searchPath.join('\n ')}');
return buffer.toString();
}
}