// Copyright (c) 2023, 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:_internal" show patch, unsafeCast;
import "dart:_js_types" show JSStringImpl;
import 'dart:_js_helper' as js;

@patch
class int {
  @patch
  static int parse(String source,
      {int? radix, @deprecated int onError(String source)?}) {
    int? value = tryParse(source, radix: radix);
    if (value != null) return value;
    if (onError != null) return onError(source);
    throw new FormatException(source);
  }

  @patch
  static int? tryParse(String source, {int? radix}) {
    // TODO(omersa): JS's `parseInt` is not compatible, copy dart2js's
    // implementation.
    if (radix == null) {
      return js
          .JS<double>('(s) => parseInt(s)',
              unsafeCast<JSStringImpl>(source).toExternRef)
          .toInt();
    } else {
      return js
          .JS<double>('(s, r) => parseInt(s, r)',
              unsafeCast<JSStringImpl>(source).toExternRef, radix.toDouble())
          .toInt();
    }
  }
}
