#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum RunPlatform {
Ios,
Android,
}
pub(crate) fn resolve_run_platform(
explicit: Option<RunPlatform>,
device_kind: Option<smix_simctl::registry::DeviceKind>,
) -> Result<RunPlatform, String> {
use smix_simctl::registry::DeviceKind;
if let Some(p) = explicit {
return Ok(p);
}
match device_kind {
Some(DeviceKind::Emulator) | Some(DeviceKind::PhysicalAndroid) => Ok(RunPlatform::Android),
Some(DeviceKind::Simulator) | Some(DeviceKind::PhysicalIos) => Ok(RunPlatform::Ios),
None => Err(
"cannot tell which platform this device is — it is not in the registry, \
so its kind is unknown. Register it (`smix sim register <alias> --udid \
<id> --kind emulator|simulator`) so the platform is read from the \
device, or pass --platform to say it once."
.to_string(),
),
}
}
impl RunPlatform {
pub(crate) fn to_flow(self) -> smix_adapter_maestro::FlowPlatform {
match self {
Self::Ios => smix_adapter_maestro::FlowPlatform::Ios,
Self::Android => smix_adapter_maestro::FlowPlatform::Android,
}
}
}
impl RunPlatform {
pub(crate) fn to_driver(self) -> smix_driver::Platform {
match self {
Self::Ios => smix_driver::Platform::Ios,
Self::Android => smix_driver::Platform::Android,
}
}
}
pub(crate) enum DeviceDial {
Registered(smix_simctl::registry::DeviceKind),
Unregistered,
}
pub(crate) fn dial_platform(
device: Option<DeviceDial>,
port_holder_kinds: &[smix_simctl::registry::DeviceKind],
) -> Result<RunPlatform, String> {
match device {
Some(DeviceDial::Registered(k)) => resolve_run_platform(None, Some(k)),
Some(DeviceDial::Unregistered) => Err(
"cannot tell which platform this --device is — it is not in the \
registry, so its kind is unknown. Pass --platform to say it once, or \
register it (`smix sim register <alias> --udid <id> --kind \
emulator|simulator`) so the platform is read from the device."
.to_string(),
),
None => {
let mut platforms: Vec<RunPlatform> = Vec::new();
for k in port_holder_kinds {
let p = resolve_run_platform(None, Some(*k))
.expect("a known device kind always classifies");
if !platforms.contains(&p) {
platforms.push(p);
}
}
match platforms.as_slice() {
[] => Ok(RunPlatform::Ios),
[one] => Ok(*one),
_ => Err("this runner port has devices of more than one platform \
registered on it (both an iOS and an Android device name it), \
so which one a verb without --device should drive is a coin \
toss. Pass --device to say which."
.to_string()),
}
}
}
}