pub mod crosstrack;
pub mod debug;
pub mod insnhits;
pub mod lifecycle;
use crate::backend::{Backend, CanonicalReq};
pub enum Dispatched {
Native {
canonical_op: &'static str,
native_cmd: String,
decorate: bool,
structured: Option<CanonicalReq>,
},
Immediate(String),
Query(crosstrack::Query),
Lifecycle(lifecycle::Lifecycle),
InsnHits(insnhits::Request),
Fallthrough,
}
pub fn dispatch(input: &str, backend: &dyn Backend) -> Dispatched {
dispatch_no_backend(input).unwrap_or_else(|| debug::dispatch_to(input, backend))
}
pub fn dispatch_no_backend(input: &str) -> Option<Dispatched> {
lifecycle::try_dispatch(input)
.or_else(|| insnhits::try_dispatch(input))
.or_else(|| crosstrack::try_dispatch(input))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::backend::lldb::LldbBackend;
#[test]
fn live_dispatch_routes_each_command_family() {
let backend = LldbBackend;
assert!(matches!(
dispatch("sessions", &backend),
Dispatched::Lifecycle(_)
));
assert!(matches!(
dispatch("insn-hits main", &backend),
Dispatched::InsnHits(_)
));
assert!(matches!(
dispatch("hits main.rs:1", &backend),
Dispatched::Query(_)
));
assert!(matches!(
dispatch("continue", &backend),
Dispatched::Native {
canonical_op: "continue",
..
}
));
assert!(matches!(
dispatch("an-unknown-command", &backend),
Dispatched::Fallthrough
));
}
#[test]
fn backend_free_dispatch_matches_live_precedence() {
let backend = LldbBackend;
let inputs = ["sessions", "insn-hits main", "hits main.rs:1"];
for input in inputs {
let live = dispatch(input, &backend);
let replay = dispatch_no_backend(input).expect("backend-free command");
assert_eq!(variant_name(&live), variant_name(&replay), "input: {input}");
}
assert!(dispatch_no_backend("continue").is_none());
assert!(dispatch_no_backend("an-unknown-command").is_none());
}
fn variant_name(dispatched: &Dispatched) -> &'static str {
match dispatched {
Dispatched::Native { .. } => "native",
Dispatched::Immediate(_) => "immediate",
Dispatched::Query(_) => "query",
Dispatched::Lifecycle(_) => "lifecycle",
Dispatched::InsnHits(_) => "insn-hits",
Dispatched::Fallthrough => "fallthrough",
}
}
}