execute function

Future<int> execute(
  1. String command, {
  2. bool verbose = false,
  3. StringSink? out,
})

Implementation

Future<int> execute(
  String command, {
  bool verbose = false,
  StringSink? out,
}) async {
  final bindings = <Abi, String>{
    Abi.windowsX64: 'rps_x64.dll',
    Abi.linuxX64: 'librps_x64.so',
    Abi.linuxArm64: 'librps_aarch64.so',
    Abi.macosX64: 'librps.dylib',
    Abi.macosArm64: 'librps.dylib',
  };

  const rootLibrary = 'package:rps/rps.dart';
  final uri = await Isolate.resolvePackageUri(Uri.parse(rootLibrary));
  if (uri == null) {
    throw RpsException('Cannot load the library.');
  }

  final platform = Abi.current();
  if (verbose) {
    out?.writeln("Running on platform: $platform");
  }

  String? libraryName = bindings[platform];

  if (verbose) {
    out?.writeln("Dynamic library file selected: $libraryName");
  }

  if (libraryName == null) {
    throw RpsException('Current platform ($platform) is currently not supported.');
  }

  final root = path.fromUri(uri.resolve(path.join('..', 'native')).path);
  final libraryPath = path.join(root, libraryName);

  if (verbose) {
    out?.writeln("Dynamic library path: $libraryPath");
  }

  final dylib = DynamicLibrary.open(libraryPath);
  final execute = dylib.lookupFunction<ExecuteNative, Execute>('execute');

  final code = execute(command.toNativeUtf8());

  return code;
}