gdbstub 0.7.10

An implementation of the GDB Remote Serial Protocol in Rust
Documentation
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<Self> {
        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,
        }
    }
}