blob: d37cfad1f3860b382b001ec6a9fe0b4d49fba673 [file] [edit]
// Copyright (c) 2026, 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:async';
import 'dart:io';
/// A proxy for [Platform] from `dart:io` which can be overridden.
PlatformInfo get platform =>
Zone.current[_platformInfoKey] as PlatformInfo? ??
PlatformInfo.defaultPlatform();
/// The key for the [platform] in the current [Zone].
final _platformInfoKey = Object();
/// Runs [callback] in a [Zone] where `platform` is overridden by [platform].
R withPlatform<R>(R Function() callback, {required PlatformInfo platform}) =>
runZoned(callback, zoneValues: {_platformInfoKey: platform});
abstract final class PlatformInfo {
const PlatformInfo._();
factory PlatformInfo.defaultPlatform() =>
const bool.fromEnvironment('dart.library.io')
? const _NativePlatformInfo()
: const _BrowserPlatformInfo();
factory PlatformInfo.override({
Map<String, String>? environment,
String? executable,
bool? isAndroid,
bool? isFuchsia,
bool? isIOS,
bool? isLinux,
bool? isMacOS,
bool? isWindows,
String? lineTerminator,
String? operatingSystem,
String? pathSeparator,
String? resolvedExecutable,
String? version,
int? numberOfProcessors,
Uri? script,
}) => _PlatformInfoOverride(
environment: environment ?? platform.environment,
executable: executable ?? platform.executable,
isAndroid: isAndroid ?? platform.isAndroid,
isFuchsia: isFuchsia ?? platform.isFuchsia,
isIOS: isIOS ?? platform.isIOS,
isLinux: isLinux ?? platform.isLinux,
isMacOS: isMacOS ?? platform.isMacOS,
isWindows: isWindows ?? platform.isWindows,
lineTerminator: lineTerminator ?? platform.lineTerminator,
operatingSystem: operatingSystem ?? platform.operatingSystem,
pathSeparator: pathSeparator ?? platform.pathSeparator,
resolvedExecutable: resolvedExecutable ?? platform.resolvedExecutable,
version: version ?? platform.version,
numberOfProcessors: numberOfProcessors ?? platform.numberOfProcessors,
script: script ?? platform.script,
);
/// Returns [Platform.environment].
Map<String, String> get environment;
/// Returns [Platform.executable].
String get executable;
/// Returns [Platform.isAndroid].
bool get isAndroid;
/// Returns [Platform.isFuchsia].
bool get isFuchsia;
/// Returns [Platform.isIOS].
bool get isIOS;
/// Returns [Platform.isLinux].
bool get isLinux;
/// Returns [Platform.isMacOS].
bool get isMacOS;
/// Returns [Platform.isWindows].
bool get isWindows;
/// Returns [Platform.lineTerminator].
String get lineTerminator;
/// Returns [Platform.operatingSystem].
String get operatingSystem;
/// Returns [Platform.pathSeparator].
String get pathSeparator;
/// Returns [Platform.resolvedExecutable].
String get resolvedExecutable;
/// Returns [Platform.numberOfProcessors].
int get numberOfProcessors;
/// Returns [Platform.script].
Uri get script;
/// Returns [Platform.version] from 'dart:io'.
String get version;
}
final class _NativePlatformInfo extends PlatformInfo {
const _NativePlatformInfo() : super._();
@override
Map<String, String> get environment => Platform.environment;
@override
String get executable => Platform.executable;
@override
bool get isAndroid => Platform.isAndroid;
@override
bool get isFuchsia => Platform.isFuchsia;
@override
bool get isIOS => Platform.isIOS;
@override
bool get isLinux => Platform.isLinux;
@override
bool get isMacOS => Platform.isMacOS;
@override
bool get isWindows => Platform.isWindows;
@override
String get lineTerminator => Platform.lineTerminator;
@override
String get operatingSystem => Platform.operatingSystem;
@override
String get pathSeparator => Platform.pathSeparator;
@override
String get resolvedExecutable => Platform.resolvedExecutable;
@override
String get version => Platform.version;
@override
int get numberOfProcessors => Platform.numberOfProcessors;
@override
Uri get script => Platform.script;
}
final class _BrowserPlatformInfo extends PlatformInfo {
const _BrowserPlatformInfo() : super._();
@override
Map<String, String> get environment => const {};
@override
String get executable => '';
@override
bool get isAndroid => false;
@override
bool get isFuchsia => false;
@override
bool get isIOS => false;
@override
bool get isLinux => false;
@override
bool get isMacOS => false;
@override
bool get isWindows => false;
@override
String get lineTerminator => '\n';
@override
String get operatingSystem => '';
@override
String get pathSeparator => '/';
@override
String get resolvedExecutable => '';
@override
String get version => '';
@override
int get numberOfProcessors => 1;
@override
Uri get script => Uri();
}
final class _PlatformInfoOverride extends PlatformInfo {
const _PlatformInfoOverride({
required this.environment,
required this.executable,
required this.isAndroid,
required this.isFuchsia,
required this.isIOS,
required this.isLinux,
required this.isMacOS,
required this.isWindows,
required this.lineTerminator,
required this.operatingSystem,
required this.pathSeparator,
required this.resolvedExecutable,
required this.version,
required this.numberOfProcessors,
required this.script,
}) : super._();
@override
final Map<String, String> environment;
@override
final String executable;
@override
final bool isAndroid;
@override
final bool isFuchsia;
@override
final bool isIOS;
@override
final bool isLinux;
@override
final bool isMacOS;
@override
final bool isWindows;
@override
final String lineTerminator;
@override
final String operatingSystem;
@override
final String pathSeparator;
@override
final String resolvedExecutable;
@override
final String version;
@override
final int numberOfProcessors;
@override
final Uri script;
}