1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#![feature(iter_array_chunks)]
#![feature(lazy_cell)]
#![allow(unused)]

mod cli;
mod config;
mod debug;
mod exec;
mod felt;
mod logger;
mod ui;

use std::rc::Rc;

use midenc_session::{
    diagnostics::{IntoDiagnostic, Report},
    Session,
};

pub use self::{
    cli::Debugger,
    config::DebuggerConfig,
    debug::*,
    exec::*,
    felt::{Felt, Felt as TestFelt, PopFromStack, PushToStack},
};

pub type ExecutionResult<T> = Result<T, Report>;

pub fn run(
    inputs: Option<DebuggerConfig>,
    args: Vec<miden_processor::Felt>,
    session: Rc<Session>,
    logger: Box<dyn log::Log>,
) -> ExecutionResult<()> {
    let mut builder = tokio::runtime::Builder::new_current_thread();
    let rt = builder.enable_all().build().into_diagnostic()?;
    rt.block_on(async move { start_ui(inputs, args, session, logger).await })
}

pub fn trace(
    _options: Option<DebuggerConfig>,
    _args: Vec<String>,
    _session: Rc<Session>,
) -> ExecutionResult<ExecutionTrace> {
    todo!()
}

pub async fn start_ui(
    inputs: Option<DebuggerConfig>,
    args: Vec<miden_processor::Felt>,
    session: Rc<Session>,
    logger: Box<dyn log::Log>,
) -> Result<(), Report> {
    use ratatui::crossterm as term;

    logger::DebugLogger::install(logger);

    let original_hook = std::panic::take_hook();
    std::panic::set_hook(Box::new(move |panic_info| {
        let _ = term::terminal::disable_raw_mode();
        let _ = term::execute!(std::io::stdout(), term::terminal::LeaveAlternateScreen);
        original_hook(panic_info);
    }));

    let mut app = ui::App::new(inputs, args, session).await?;
    app.run().await?;

    Ok(())
}