Skip to main content

miden_debug/ui/
mod.rs

1mod action;
2mod app;
3mod duration;
4mod pages;
5mod panes;
6mod state;
7mod syntax_highlighting;
8mod tui;
9
10use miden_assembly_syntax::diagnostics::{IntoDiagnostic, Report};
11
12pub use self::state::{DebugMode, State};
13use self::{action::Action, app::App};
14use crate::config::DebuggerConfig;
15
16#[allow(dead_code)]
17pub fn run(config: Box<DebuggerConfig>, logger: Box<dyn log::Log>) -> Result<(), Report> {
18    let mut builder = tokio::runtime::Builder::new_current_thread();
19    let rt = builder.enable_all().build().into_diagnostic()?;
20    rt.block_on(async move { start_ui(config, logger).await })
21}
22
23/// Launch the TUI debugger with a pre-built [State].
24///
25/// This is the programmatic entry point used by transaction debugging, where
26/// the caller constructs a [State] with pre-recorded event replay data.
27pub fn run_with_state(state: State, logger: Box<dyn log::Log>) -> Result<(), Report> {
28    let mut builder = tokio::runtime::Builder::new_current_thread();
29    let rt = builder.enable_all().build().into_diagnostic()?;
30    rt.block_on(async move { start_ui_with_state(state, logger).await })
31}
32
33#[allow(dead_code)]
34pub async fn start_ui(
35    config: Box<DebuggerConfig>,
36    logger: Box<dyn log::Log>,
37) -> Result<(), Report> {
38    use ratatui::crossterm as term;
39
40    crate::logger::DebugLogger::install(logger);
41
42    let original_hook = std::panic::take_hook();
43    std::panic::set_hook(Box::new(move |panic_info| {
44        let _ = term::terminal::disable_raw_mode();
45        let _ = term::execute!(std::io::stdout(), term::terminal::LeaveAlternateScreen);
46        original_hook(panic_info);
47    }));
48
49    let mut app = App::new(config).await?;
50    app.run().await?;
51
52    Ok(())
53}
54
55async fn start_ui_with_state(state: State, logger: Box<dyn log::Log>) -> Result<(), Report> {
56    use ratatui::crossterm as term;
57
58    crate::logger::DebugLogger::install(logger);
59
60    let original_hook = std::panic::take_hook();
61    std::panic::set_hook(Box::new(move |panic_info| {
62        let _ = term::terminal::disable_raw_mode();
63        let _ = term::execute!(std::io::stdout(), term::terminal::LeaveAlternateScreen);
64        original_hook(panic_info);
65    }));
66
67    let mut app = App::from_state(state).await?;
68    app.run().await?;
69
70    Ok(())
71}