(state: AppState, udid: String, step: BatchStep)
| 665 | } |
| 666 | |
| 667 | async fn run_batch_step(state: AppState, udid: String, step: BatchStep) -> Result<Value, AppError> { |
| 668 | match step { |
| 669 | BatchStep::Sleep { ms, seconds } => { |
| 670 | let duration = |
| 671 | ms.unwrap_or_else(|| ((seconds.unwrap_or(0.0) * 1000.0).max(0.0)) as u64); |
| 672 | tokio::time::sleep(Duration::from_millis(duration)).await; |
| 673 | Ok(json_value!({ "action": "sleep", "durationMs": duration })) |
| 674 | } |
| 675 | BatchStep::Tap(payload) => { |
| 676 | let expected = perform_tap_payload(state, udid, payload).await?; |
| 677 | let mut result = json_value!({ "action": "tap" }); |
| 678 | if let (Some(object), Some(expected)) = (result.as_object_mut(), expected) { |
| 679 | object.insert("expectation".to_owned(), expected); |
| 680 | } |
| 681 | Ok(result) |
| 682 | } |
| 683 | BatchStep::Back { |
| 684 | timeout_ms, |
| 685 | poll_ms, |
| 686 | fallback_swipe, |
| 687 | } => { |
| 688 | perform_back_payload(state, udid, timeout_ms, poll_ms, fallback_swipe).await |
| 689 | } |
| 690 | BatchStep::WaitFor(payload) => { |
| 691 | let snapshot = wait_for_snapshot_match(state, udid, payload.clone()).await?; |
| 692 | let found = first_matching_element(&snapshot, &payload.selector) |
| 693 | .ok_or_else(|| AppError::not_found("No accessibility element matched."))?; |
| 694 | Ok(json_value!({ "action": "waitFor", "match": compact_accessibility_node(&found) })) |
| 695 | } |
| 696 | BatchStep::Assert(payload) => { |
| 697 | let snapshot = wait_for_snapshot_match(state, udid, payload.clone()).await?; |
| 698 | let found = first_matching_element(&snapshot, &payload.selector) |
| 699 | .ok_or_else(|| AppError::not_found("No accessibility element matched."))?; |
| 700 | Ok(json_value!({ "action": "assert", "match": compact_accessibility_node(&found) })) |
| 701 | } |
| 702 | BatchStep::Query(payload) => query_element_payload(state, udid, payload).await, |
| 703 | BatchStep::AssertNot(payload) => { |
| 704 | let Json(_) = wait_for_absent_element_payload(state, udid, payload).await?; |
| 705 | Ok(json_value!({ "action": "assertNot" })) |
| 706 | } |
| 707 | BatchStep::ScrollUntilVisible(payload) => { |
| 708 | let Json(result) = scroll_until_visible_payload(state, udid, payload).await?; |
| 709 | Ok(json_value!({ |
| 710 | "action": "scrollUntilVisible", |
| 711 | "match": result.get("match").cloned().unwrap_or(Value::Null), |
| 712 | "scrollCount": result.get("scrollCount").cloned().unwrap_or(Value::Null), |
| 713 | })) |
| 714 | } |
| 715 | BatchStep::Key { |
| 716 | key_code, |
| 717 | modifiers, |
| 718 | } => { |
| 719 | if android::is_android_id(&udid) { |
| 720 | run_android_action(state, move |android| { |
| 721 | android.send_key(&udid, key_code, modifiers.unwrap_or(0)) |
| 722 | }) |
| 723 | .await?; |
| 724 | return Ok(json_value!({ "action": "key" })); |
no test coverage detected