(
args: Args,
target_path: Option<Utf8PlatformPathBuf>,
base_path: Option<Utf8PlatformPathBuf>,
project_config: Option<ProjectConfig>,
unit_options: Option<ProjectOptions>,
)
| 353 | } |
| 354 | |
| 355 | fn run_interactive( |
| 356 | args: Args, |
| 357 | target_path: Option<Utf8PlatformPathBuf>, |
| 358 | base_path: Option<Utf8PlatformPathBuf>, |
| 359 | project_config: Option<ProjectConfig>, |
| 360 | unit_options: Option<ProjectOptions>, |
| 361 | ) -> Result<()> { |
| 362 | let Some(symbol_name) = &args.symbol else { bail!("Interactive mode requires a symbol name") }; |
| 363 | let time_format = time::format_description::parse_borrowed::<2>("[hour]:[minute]:[second]") |
| 364 | .context("Failed to parse time format")?; |
| 365 | let (diff_obj_config, mapping_config) = |
| 366 | build_config_from_args(&args, project_config.as_ref(), unit_options.as_ref())?; |
| 367 | let mut state = AppState { |
| 368 | jobs: Default::default(), |
| 369 | waker: Default::default(), |
| 370 | project_dir: args.project.clone(), |
| 371 | project_config, |
| 372 | target_path, |
| 373 | base_path, |
| 374 | left_status: None, |
| 375 | right_status: None, |
| 376 | left_obj: None, |
| 377 | right_obj: None, |
| 378 | prev_obj: None, |
| 379 | reload_time: None, |
| 380 | time_format, |
| 381 | watcher: None, |
| 382 | modified: Default::default(), |
| 383 | diff_obj_config, |
| 384 | mapping_config, |
| 385 | }; |
| 386 | if let (Some(project_dir), Some(project_config)) = (&state.project_dir, &state.project_config) { |
| 387 | let watch_patterns = project_config.build_watch_patterns()?; |
| 388 | let ignore_patterns = project_config.build_ignore_patterns()?; |
| 389 | state.watcher = Some(create_watcher( |
| 390 | state.modified.clone(), |
| 391 | project_dir.as_ref(), |
| 392 | build_globset(&watch_patterns)?, |
| 393 | build_globset(&ignore_patterns)?, |
| 394 | Waker::from(state.waker.clone()), |
| 395 | )?); |
| 396 | } |
| 397 | let mut view: Box<dyn UiView> = |
| 398 | Box::new(FunctionDiffUi { symbol_name: symbol_name.clone(), ..Default::default() }); |
| 399 | state.reload()?; |
| 400 | |
| 401 | crossterm_panic_handler(); |
| 402 | enable_raw_mode()?; |
| 403 | crossterm::queue!( |
| 404 | stdout(), |
| 405 | EnterAlternateScreen, |
| 406 | EnableMouseCapture, |
| 407 | SetTitle(format!("{symbol_name} - objdiff")), |
| 408 | )?; |
| 409 | let backend = CrosstermBackend::new(stdout()); |
| 410 | let mut terminal = Terminal::new(backend)?; |
| 411 | |
| 412 | let mut result = EventResult { redraw: true, ..Default::default() }; |
no test coverage detected