blob: c75010846a9a5f681eb7e8de879a0d982a68b749 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. 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:convert';
/// Provides API parity with the `Platform` class in `dart:io`, but using
/// instance properties rather than static properties. This difference enables
/// the use of these APIs in tests, where you can provide mock implementations.
abstract class Platform {
/// Creates a new [Platform].
const Platform();
/// The number of processors of the machine.
int get numberOfProcessors;
/// The path separator used by the operating system to separate
/// components in file paths.
String get pathSeparator;
/// A string (`linux`, `macos`, `windows`, `android`, `ios`, or `fuchsia`)
/// representing the operating system.
String get operatingSystem;
/// Get the local hostname for the system.
String get localHostname;
/// True if the operating system is Linux.
bool get isLinux => (operatingSystem == "linux");
/// True if the operating system is OS X.
bool get isMacOS => (operatingSystem == "macos");
/// True if the operating system is Windows.
bool get isWindows => (operatingSystem == "windows");
/// True if the operating system is Android.
bool get isAndroid => (operatingSystem == "android");
/// True if the operating system is iOS.
bool get isIOS => (operatingSystem == "ios");
/// True if the operating system is Fuchsia
bool get isFuchsia => (operatingSystem == "fuchsia");
/// The environment for this process.
///
/// The returned environment is an unmodifiable map whose content is
/// retrieved from the operating system on its first use.
///
/// Environment variables on Windows are case-insensitive. The map
/// returned on Windows is therefore case-insensitive and will convert
/// all keys to upper case. On other platforms the returned map is
/// a standard case-sensitive map.
Map<String, String> get environment;
/// The path of the executable used to run the script in this isolate.
///
/// The path returned is the literal path used to run the script. This
/// path might be relative or just be a name from which the executable
/// was found by searching the `PATH`.
///
/// To get the absolute path to the resolved executable use
/// [resolvedExecutable].
String get executable;
/// The path of the executable used to run the script in this
/// isolate after it has been resolved by the OS.
///
/// This is the absolute path, with all symlinks resolved, to the
/// executable used to run the script.
String get resolvedExecutable;
/// The absolute URI of the script being run in this
/// isolate.
///
/// If the script argument on the command line is relative,
/// it is resolved to an absolute URI before fetching the script, and
/// this absolute URI is returned.
///
/// URI resolution only does string manipulation on the script path, and this
/// may be different from the file system's path resolution behavior. For
/// example, a symbolic link immediately followed by '..' will not be
/// looked up.
///
/// If the executable environment does not support [script] an empty
/// [Uri] is returned.
Uri get script;
/// The flags passed to the executable used to run the script in this
/// isolate. These are the command-line flags between the executable name
/// and the script name. Each fetch of `executableArguments` returns a new
/// list containing the flags passed to the executable.
List<String> get executableArguments;
/// The value of the `--package-root` flag passed to the executable
/// used to run the script in this isolate. This is the directory in which
/// Dart packages are looked up.
///
/// If there is no `--package-root` flag, `null` is returned.
String get packageRoot;
/// The value of the `--packages` flag passed to the executable
/// used to run the script in this isolate. This is the configuration which
/// specifies how Dart packages are looked up.
///
/// If there is no `--packages` flag, `null` is returned.
String get packageConfig;
/// The version of the current Dart runtime.
///
/// The returned `String` is formatted as the [semver](http://semver.org)
/// version string of the current dart runtime, possibly followed by
/// whitespace and other version and build details.
String get version;
/// When stdin is connected to a terminal, whether ANSI codes are supported.
bool get stdinSupportsAnsi;
/// When stdout is connected to a terminal, whether ANSI codes are supported.
bool get stdoutSupportsAnsi;
/// Returns a JSON-encoded representation of this platform.
String toJson() {
return const JsonEncoder.withIndent(' ').convert(<String, dynamic>{
'numberOfProcessors': numberOfProcessors,
'pathSeparator': pathSeparator,
'operatingSystem': operatingSystem,
'localHostname': localHostname,
'environment': environment,
'executable': executable,
'resolvedExecutable': resolvedExecutable,
'script': script.toString(),
'executableArguments': executableArguments,
'packageRoot': packageRoot,
'packageConfig': packageConfig,
'version': version,
'stdinSupportsAnsi': stdinSupportsAnsi,
'stdoutSupportsAnsi': stdoutSupportsAnsi,
});
}
}