fn parse()

in reverie-ptrace/src/gdbstub/commands/base/_vFile.rs [74:116]


    fn parse(mut bytes: BytesMut) -> Option<Self> {
        if bytes.starts_with(b":setfs:") {
            let pid: i32 = decode_hex(&bytes[b":setfs:".len()..]).ok()?;
            Some(vFile::Setfs(if pid == 0 { None } else { Some(pid) }))
        } else if bytes.starts_with(b":open:") {
            let mut iter = bytes[b":open:".len()..].split_mut(|c| *c == b',');
            let fname = iter.next().and_then(|s| decode_hex_string(s).ok())?;
            let fname = PathBuf::from(OsString::from_vec(fname));
            let flags = iter.next().and_then(|s| decode_hex(s).ok())?;
            let mode = iter.next().and_then(|s| decode_hex(s).ok())?;
            Some(vFile::Open(fname, flags, mode))
        } else if bytes.starts_with(b":close:") {
            let fd: i32 = decode_hex(&bytes[b":close:".len()..]).ok()?;
            Some(vFile::Close(fd))
        } else if bytes.starts_with(b":pread:") {
            let mut iter = bytes[b":pread:".len()..].split_mut(|c| *c == b',');
            let fd = iter.next().and_then(|s| decode_hex(s).ok())?;
            let count = iter.next().and_then(|s| decode_hex(s).ok())?;
            let offset = iter.next().and_then(|s| decode_hex(s).ok())?;
            Some(vFile::Pread(fd, count, offset))
        } else if bytes.starts_with(b":pwrite:") {
            let mut iter = bytes[b":pwrite:".len()..].split_mut(|c| *c == b',');
            let fd = iter.next().and_then(|s| decode_hex(s).ok())?;
            let offset = iter.next().and_then(|s| decode_hex(s).ok())?;
            let bytes = iter.next().and_then(|s| decode_binary_string(s).ok())?;
            Some(vFile::Pwrite(fd, offset, bytes))
        } else if bytes.starts_with(b":fstat:") {
            let fd: i32 = decode_hex(&bytes[b":fstat:".len()..]).ok()?;
            Some(vFile::Fstat(fd))
        } else if bytes.starts_with(b":unlink:") {
            let fname = bytes.split_off(b":unlink:".len());
            let fname = decode_hex_string(&fname).ok()?;
            let fname = PathBuf::from(OsString::from_vec(fname));
            Some(vFile::Unlink(fname))
        } else if bytes.starts_with(b":readlink:") {
            let fname = bytes.split_off(b":readlink:".len());
            let fname = decode_hex_string(&fname).ok()?;
            let fname = PathBuf::from(OsString::from_vec(fname));
            Some(vFile::Readlink(fname))
        } else {
            None
        }
    }