// Copyright (c) 2012, 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.

// part of "common_patch.dart";

@patch
@pragma("vm:entry-point")
class _Platform {
  @patch
  @pragma("vm:external-name", "Platform_NumberOfProcessors")
  external static int _numberOfProcessors();
  @patch
  @pragma("vm:external-name", "Platform_PathSeparator")
  external static String _pathSeparator();
  @patch
  @pragma("vm:external-name", "Platform_OperatingSystem")
  external static String _operatingSystem();
  @patch
  @pragma("vm:external-name", "Platform_OperatingSystemVersion")
  external static _operatingSystemVersion();
  @patch
  @pragma("vm:external-name", "Platform_LocalHostname")
  external static _localHostname();
  @patch
  @pragma("vm:external-name", "Platform_ExecutableName")
  external static _executable();
  @patch
  @pragma("vm:external-name", "Platform_ResolvedExecutableName")
  external static _resolvedExecutable();
  @patch
  @pragma("vm:external-name", "Platform_Environment")
  external static _environment();
  @patch
  @pragma("vm:external-name", "Platform_ExecutableArguments")
  external static List<String> _executableArguments();
  @patch
  @pragma("vm:external-name", "Platform_GetVersion")
  external static String _version();

  @patch
  @pragma("vm:external-name", "Platform_LocaleName")
  external static String _localeName();

  @patch
  static String? _packageRoot() => VMLibraryHooks.packageRootString;
  @patch
  static String? _packageConfig() => VMLibraryHooks.packageConfigString;

  @patch
  static Uri _script() => VMLibraryHooks.platformScript!;

  // This script singleton is written to by the embedder if applicable.
  @pragma("vm:entry-point")
  static void set _nativeScript(String path) {
    VMLibraryHooks.platformScript = (() {
      if (path.startsWith('http:') ||
          path.startsWith('https:') ||
          path.startsWith('package:') ||
          path.startsWith('dart:') ||
          path.startsWith('data:') ||
          path.startsWith('file:')) {
        return Uri.parse(path);
      } else {
        return Uri.base.resolveUri(new Uri.file(path));
      }
    });
  }
}
