bugstalker/ui/command/
async.rs1use 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}