gdbstub 0.7.10

An implementation of the GDB Remote Serial Protocol in Rust
Documentation
use super::prelude::*;
use crate::protocol::common::hex::decode_bin_buf;

#[derive(Debug)]
pub struct vFlashWrite<'a> {
    pub addr: &'a [u8],
    pub val: &'a [u8],
}

impl<'a> ParseCommand<'a> for vFlashWrite<'a> {
    #[inline(always)]
    fn from_packet(buf: PacketBuf<'a>) -> Option<Self> {
        let body = buf.into_body();

        let mut body = body.splitn_mut(3, |&b| b == b':');
        let _first_colon = body.next()?;
        let addr = decode_hex_buf(body.next()?)
            .ok()
            .filter(|a| !a.is_empty())?;
        let val = decode_bin_buf(body.next()?)?;

        Some(vFlashWrite { addr, val })
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    macro_rules! test_buf {
        ($bufname:ident, $body:literal) => {
            let mut test = $body.to_vec();
            let mut buf = PacketBuf::new_with_raw_body(&mut test).unwrap();
            if !buf.strip_prefix(b"vFlashWrite") {
                panic!("invalid test");
            }
            let $bufname = buf;
        };
    }

    #[test]
    fn valid_vFlashWrite() {
        test_buf!(
            buf,
            b"vFlashWrite:08000000:\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
        );

        let pkt = vFlashWrite::from_packet(buf).unwrap();

        assert_eq!(pkt.addr, [0x08, 0, 0, 0]);
        assert_eq!(pkt.val, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
    }

    #[test]
    fn invalid_vFlashWrite_wrong_address() {
        test_buf!(
            buf,
            b"vFlashWrite:abcdefg:\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
        );

        assert!(vFlashWrite::from_packet(buf).is_none())
    }

    #[test]
    fn invalid_vFlashWrite_missing_data() {
        test_buf!(buf, b"vFlashWrite:abcdefg:");

        assert!(vFlashWrite::from_packet(buf).is_none())
    }

    #[test]
    fn invalid_vFlashWrite_missing_address() {
        test_buf!(buf, b"vFlashWrite:");

        assert!(vFlashWrite::from_packet(buf).is_none())
    }
}