// 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));
      }
    });
  }
}
