use super::prelude::*; use crate::target::ext::tracepoints::FrameRequest; use crate::target::ext::tracepoints::Tracepoint; #[derive(Debug)] pub struct QTFrame<'a>(pub FrameRequest<&'a mut [u8]>); impl<'a> ParseCommand<'a> for QTFrame<'a> { #[inline(always)] fn from_packet(buf: PacketBuf<'a>) -> Option { let body = buf.into_body(); match body { [b':', body @ ..] => { let mut s = body.split_mut(|b| *b == b':'); let selector = s.next()?; // Clippy incorrect thinks this as_ref isn't needed, but it is. #[allow(clippy::useless_asref)] Some(match selector.as_ref() { b"pc" => { let addr = decode_hex_buf(s.next()?).ok()?; QTFrame(FrameRequest::AtPC(addr)) } b"tdp" => { let tp = Tracepoint(decode_hex(s.next()?).ok()?); QTFrame(FrameRequest::Hit(tp)) } b"range" => { let start = decode_hex_buf(s.next()?).ok()?; let end = decode_hex_buf(s.next()?).ok()?; QTFrame(FrameRequest::Between(start, end)) } b"outside" => { let start = decode_hex_buf(s.next()?).ok()?; let end = decode_hex_buf(s.next()?).ok()?; QTFrame(FrameRequest::Outside(start, end)) } n => QTFrame(FrameRequest::Select(decode_hex(n).ok()?)), }) } _ => None, } } }