(
State(state): State<AppState>,
Path(udid): Path<String>,
Query(query): Query<LogsQuery>,
)
| 3814 | } |
| 3815 | |
| 3816 | async fn simulator_logs( |
| 3817 | State(state): State<AppState>, |
| 3818 | Path(udid): Path<String>, |
| 3819 | Query(query): Query<LogsQuery>, |
| 3820 | ) -> Result<Json<Value>, AppError> { |
| 3821 | let limit = query.limit.unwrap_or(250).clamp(1, 1000); |
| 3822 | if android::is_android_id(&udid) { |
| 3823 | let entries = run_android_action(state, move |android| android.logs(&udid, limit)).await?; |
| 3824 | return Ok(json(json_value!({ "entries": entries }))); |
| 3825 | } |
| 3826 | let filters = LogFilters::new( |
| 3827 | split_filter_values(query.levels.as_deref()), |
| 3828 | split_filter_values(query.processes.as_deref()), |
| 3829 | query.q.as_deref().unwrap_or("").trim().to_lowercase(), |
| 3830 | ); |
| 3831 | let entries = if query.backfill.unwrap_or(false) { |
| 3832 | let seconds = query.seconds.unwrap_or(30.0).clamp(1.0, 1800.0); |
| 3833 | run_bridge_action(state.clone(), move |bridge| { |
| 3834 | bridge.recent_logs(&udid, seconds, limit, &filters) |
| 3835 | }) |
| 3836 | .await? |
| 3837 | } else { |
| 3838 | state.logs.ensure_started(&udid).await?; |
| 3839 | state.logs.snapshot(&udid, &filters, limit).await |
| 3840 | }; |
| 3841 | Ok(json(json_value!({ |
| 3842 | "entries": entries, |
| 3843 | }))) |
| 3844 | } |
| 3845 | |
| 3846 | #[derive(Clone, Copy)] |
| 3847 | enum InAppHierarchySource { |
nothing calls this directly
no test coverage detected