bugstalker/ui/command/
async.rs

1use crate::debugger::r#async::AsyncBacktrace;
2use crate::debugger::{Debugger, Error};
3
4#[derive(Debug, Clone, PartialEq)]
5pub enum Command {
6    ShortBacktrace,
7    FullBacktrace,
8    CurrentTask(Option<String>),
9    StepOver,
10    StepOut,
11}
12
13pub enum AsyncCommandResult<'a> {
14    StepOver,
15    StepOut,
16    ShortBacktrace(AsyncBacktrace),
17    FullBacktrace(AsyncBacktrace),
18    CurrentTask(AsyncBacktrace, Option<&'a str>),
19}
20
21pub struct Handler<'a> {
22    dbg: &'a mut Debugger,
23}
24
25impl<'a> Handler<'a> {
26    pub fn new(debugger: &'a mut Debugger) -> Self {
27        Self { dbg: debugger }
28    }
29
30    pub fn handle<'cmd>(&mut self, cmd: &'cmd Command) -> Result<AsyncCommandResult<'cmd>, Error> {
31        let result = match cmd {
32            Command::ShortBacktrace => {
33                AsyncCommandResult::ShortBacktrace(self.dbg.async_backtrace()?)
34            }
35            Command::FullBacktrace => {
36                AsyncCommandResult::FullBacktrace(self.dbg.async_backtrace()?)
37            }
38            Command::CurrentTask(regex) => {
39                AsyncCommandResult::CurrentTask(self.dbg.async_backtrace()?, regex.as_deref())
40            }
41            Command::StepOver => {
42                self.dbg.async_step_over()?;
43                AsyncCommandResult::StepOver
44            }
45            Command::StepOut => {
46                self.dbg.async_step_out()?;
47                AsyncCommandResult::StepOut
48            }
49        };
50        Ok(result)
51    }
52}