listSimulators function

Future<SimulatorListing> listSimulators()

Lists every simulator known to simctl via simctl list devices -j.

Implementation

Future<SimulatorListing> listSimulators() async {
  final String stdoutStr;
  try {
    final result = await Process.run(xcrunExecutable, ['simctl', 'list', 'devices', '-j']);
    if (result.exitCode != 0) {
      final err = (result.stderr as String).trim();
      return (simulators: null, error: err.isNotEmpty ? err : 'simctl exited with code ${result.exitCode}');
    }
    stdoutStr = result.stdout as String;
  } catch (e) {
    return (simulators: null, error: 'Failed to run xcrun simctl: $e');
  }
  try {
    final decoded = jsonDecode(stdoutStr) as Map<String, dynamic>;
    final byRuntime = decoded['devices'] as Map<String, dynamic>;
    final simulators = <SimulatorDevice>[
      for (final entry in byRuntime.entries)
        for (final device in (entry.value as List<dynamic>).cast<Map<String, dynamic>>())
          (
            udid: device['udid'] as String,
            name: device['name'] as String? ?? 'unknown',
            state: device['state'] as String? ?? 'unknown',
            runtime: entry.key,
          ),
    ];
    return (simulators: simulators, error: null);
  } catch (e) {
    return (simulators: null, error: 'Could not parse `xcrun simctl list devices -j` output: $e');
  }
}