| 3223 | } |
| 3224 | |
| 3225 | fn parse_tap_command_args( |
| 3226 | args: Vec<String>, |
| 3227 | id: Option<String>, |
| 3228 | label: Option<String>, |
| 3229 | value: Option<String>, |
| 3230 | element_type: Option<String>, |
| 3231 | ) -> anyhow::Result<TapCommandTarget> { |
| 3232 | let mut target = TapCommandTarget { |
| 3233 | selector: ElementSelector { |
| 3234 | id, |
| 3235 | label, |
| 3236 | value, |
| 3237 | element_type, |
| 3238 | index: None, |
| 3239 | }, |
| 3240 | ..Default::default() |
| 3241 | }; |
| 3242 | |
| 3243 | let args = args |
| 3244 | .into_iter() |
| 3245 | .map(|arg| arg.trim().to_owned()) |
| 3246 | .filter(|arg| !arg.is_empty()) |
| 3247 | .collect::<Vec<_>>(); |
| 3248 | |
| 3249 | if !target.selector.is_empty() { |
| 3250 | match args.as_slice() { |
| 3251 | [] => return Ok(target), |
| 3252 | [udid] => { |
| 3253 | target.udid = Some(udid.clone()); |
| 3254 | return Ok(target); |
| 3255 | } |
| 3256 | _ => anyhow::bail!( |
| 3257 | "tap accepts at most one positional UDID when selector flags are used." |
| 3258 | ), |
| 3259 | } |
| 3260 | } |
| 3261 | |
| 3262 | if args.is_empty() { |
| 3263 | return Ok(target); |
| 3264 | } |
| 3265 | |
| 3266 | let (udid, target_args) = if args.len() >= 2 && looks_like_device_selector(&args[0]) { |
| 3267 | (Some(args[0].clone()), &args[1..]) |
| 3268 | } else { |
| 3269 | (None, args.as_slice()) |
| 3270 | }; |
| 3271 | target.udid = udid; |
| 3272 | |
| 3273 | if target_args.len() == 2 { |
| 3274 | if let (Some(x), Some(y)) = ( |
| 3275 | parse_f64_arg(&target_args[0]), |
| 3276 | parse_f64_arg(&target_args[1]), |
| 3277 | ) { |
| 3278 | target.x = Some(x); |
| 3279 | target.y = Some(y); |
| 3280 | return Ok(target); |
| 3281 | } |
| 3282 | } |