blob: eade019ea10940788f599173a4ac12c04562cbdf [file] [log] [blame] [edit]
// Copyright (c) 2024, 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:io';
import 'syntax.g.dart';
/// An operating system which the Dart VM can run on.
final class OS {
/// The name of this operating system.
final String name;
const OS._(this.name);
/// The
/// [Android](https://en.wikipedia.org/wiki/Android_%28operating_system%29)
/// operating system.
static const OS android = OS._('android');
/// The [Fuchsia](https://en.wikipedia.org/wiki/Google_Fuchsia) operating
/// system.
static const OS fuchsia = OS._('fuchsia');
/// The [iOS](https://en.wikipedia.org/wiki/IOS) operating system.
static const OS iOS = OS._('ios');
/// The [Linux](https://en.wikipedia.org/wiki/Linux) operating system.
static const OS linux = OS._('linux');
/// The [macOS](https://en.wikipedia.org/wiki/MacOS) operating system.
static const OS macOS = OS._('macos');
/// The
/// [Microsoft Windows](https://en.wikipedia.org/wiki/Microsoft_Windows)
/// operating system.
static const OS windows = OS._('windows');
/// Known values for [OS].
static const List<OS> values = [android, fuchsia, iOS, linux, macOS, windows];
/// Typical cross compilation between OSes.
static const osCrossCompilationDefault = {
OS.macOS: [OS.macOS, OS.iOS, OS.android],
OS.linux: [OS.linux, OS.android],
OS.windows: [OS.windows, OS.android],
};
/// The name of this [OS].
///
/// This returns a stable string that can be used to construct a
/// [OS] via [OS.fromString].
@override
String toString() => name;
/// Creates a [OS] from the given [name].
///
/// The name can be obtained from [OS.name] or [OS.toString].
factory OS.fromString(String name) =>
OSSyntaxExtension.fromSyntax(OSSyntax.fromJson(name));
/// The current [OS].
///
/// Consisten with the [Platform.version] string.
static final OS current = OS.fromString(Platform.operatingSystem);
}
/// Extension methods for [OS] to convert to and from the syntax model.
extension OSSyntaxExtension on OS {
static final _toSyntax = {
for (final item in OS.values) item: OSSyntax.fromJson(item.name),
};
static final _fromSyntax = {
for (var entry in _toSyntax.entries) entry.value: entry.key,
};
/// Converts this [OS] to its corresponding [OSSyntax].
OSSyntax toSyntax() => _toSyntax[this]!;
/// Converts an [OSSyntax] to its corresponding [OS].
static OS fromSyntax(OSSyntax syntax) => switch (_fromSyntax[syntax]) {
null => throw FormatException('The OS "${syntax.name}" is not known'),
final e => e,
};
}