1 use super::prelude::*; 2 use crate::target::ext::tracepoints::FrameRequest; 3 use crate::target::ext::tracepoints::Tracepoint; 4 5 #[derive(Debug)] 6 pub struct QTFrame<'a>(pub FrameRequest<&'a mut [u8]>); 7 8 impl<'a> ParseCommand<'a> for QTFrame<'a> { 9 #[inline(always)] from_packet(buf: PacketBuf<'a>) -> Option<Self>10 fn from_packet(buf: PacketBuf<'a>) -> Option<Self> { 11 let body = buf.into_body(); 12 match body { 13 [b':', body @ ..] => { 14 let mut s = body.split_mut(|b| *b == b':'); 15 let selector = s.next()?; 16 // Clippy incorrect thinks this as_ref isn't needed, but it is. 17 #[allow(clippy::useless_asref)] 18 Some(match selector.as_ref() { 19 b"pc" => { 20 let addr = decode_hex_buf(s.next()?).ok()?; 21 QTFrame(FrameRequest::AtPC(addr)) 22 } 23 b"tdp" => { 24 let tp = Tracepoint(decode_hex(s.next()?).ok()?); 25 QTFrame(FrameRequest::Hit(tp)) 26 } 27 b"range" => { 28 let start = decode_hex_buf(s.next()?).ok()?; 29 let end = decode_hex_buf(s.next()?).ok()?; 30 QTFrame(FrameRequest::Between(start, end)) 31 } 32 b"outside" => { 33 let start = decode_hex_buf(s.next()?).ok()?; 34 let end = decode_hex_buf(s.next()?).ok()?; 35 QTFrame(FrameRequest::Outside(start, end)) 36 } 37 n => QTFrame(FrameRequest::Select(decode_hex(n).ok()?)), 38 }) 39 } 40 _ => None, 41 } 42 } 43 } 44