xcb-rust-protocol 0.3.0

Rust x11 connection interface layer
Documentation
use crate::con::{SocketIo, XcbState};
use core::marker::PhantomData;

use crate::util::{FixedLengthFromBytes, VariableLengthFromBytes};

#[derive(Copy, Clone, Debug)]
pub struct Cookie<REPLY>
where
    REPLY: VariableLengthFromBytes,
{
    pub seq: u16,
    pub(crate) _data: PhantomData<REPLY>,
}

impl<REPLY> Cookie<REPLY>
where
    REPLY: VariableLengthFromBytes,
{
    #[inline]
    #[must_use]
    pub(crate) fn new(seq: u16) -> Self {
        Cookie {
            seq,
            _data: PhantomData,
        }
    }

    #[inline]
    pub fn reply<IO: SocketIo, XS: XcbState>(
        self,
        io: &mut IO,
        state: &mut XS,
    ) -> crate::Result<REPLY> {
        let reply_buf = state.block_for_reply(io, self.seq)?;
        let (reply, _offset) = REPLY::from_bytes(&reply_buf)?;
        Ok(reply)
    }

    #[inline]
    pub fn forget<XS>(self, state: &mut XS)
    where
        XS: XcbState,
    {
        state.forget(self.seq);
    }
}

#[derive(Copy, Clone, Debug)]
pub struct FixedCookie<REPLY, const FIXED_SIZE: usize>
where
    REPLY: FixedLengthFromBytes<FIXED_SIZE>,
{
    pub seq: u16,
    pub(crate) _data: PhantomData<REPLY>,
}

impl<REPLY, const FIXED_SIZE: usize> FixedCookie<REPLY, FIXED_SIZE>
where
    REPLY: FixedLengthFromBytes<FIXED_SIZE>,
{
    #[inline]
    #[must_use]
    pub(crate) fn new(seq: u16) -> Self {
        FixedCookie {
            seq,
            _data: PhantomData,
        }
    }

    #[inline]
    pub fn reply<IO: SocketIo, XS: XcbState>(
        self,
        io: &mut IO,
        state: &mut XS,
    ) -> crate::Result<REPLY> {
        let reply_buf = state.block_for_reply(io, self.seq)?;
        let reply = REPLY::from_bytes(&reply_buf)?;
        Ok(reply)
    }

    #[inline]
    pub fn forget<XS: XcbState>(self, state: &mut XS) {
        state.forget(self.seq);
    }
}

#[derive(Copy, Clone, Debug)]
pub struct VoidCookie {
    pub seq: u16,
}

impl VoidCookie {
    #[inline]
    #[must_use]
    pub(crate) fn new(seq: u16) -> Self {
        Self { seq }
    }

    #[inline]
    pub fn check<IO: SocketIo, XS: XcbState>(
        self,
        io: &mut IO,
        state: &mut XS,
    ) -> crate::Result<()> {
        state.block_check_err(io, self.seq)?;
        Ok(())
    }
    #[inline]
    pub fn forget<XS>(self, state: &mut XS)
    where
        XS: XcbState,
    {
        state.forget(self.seq);
    }
}