Skip to main content

dope_core/io/socket/install/
receive.rs

1use std::{marker, mem};
2
3use crate::{driver, driver::settings, io::transfer};
4
5/// Datagram receive capacity proved for one invariant driver generation.
6pub(crate) struct Capacity<'d>(marker::PhantomData<driver::Reference<'d>>);
7
8/// Datagram receive storage cannot hold one framed payload byte.
9#[derive(Clone, Copy, PartialEq, Eq, Debug)]
10pub struct Error {
11    actual: transfer::NonZero,
12    required: transfer::NonZero,
13}
14
15impl<'d> Capacity<'d> {
16    pub(in crate::io::socket::install) fn try_new(
17        driver: driver::Reference<'d>,
18    ) -> Result<Self, Error> {
19        let actual = driver.receive().layout().buffer_len();
20        let required = settings::Receive::MIN_DATAGRAM_SLOT;
21        if actual.into_nonzero() < required.into_nonzero() {
22            return Err(Error { actual, required });
23        }
24        Ok(Self(marker::PhantomData))
25    }
26}
27
28impl Error {
29    pub const fn actual(&self) -> transfer::NonZero {
30        self.actual
31    }
32
33    pub const fn required(&self) -> transfer::NonZero {
34        self.required
35    }
36}
37
38const _: () = {
39    assert!(mem::size_of::<Capacity<'static>>() == 0);
40    assert!(mem::align_of::<Capacity<'static>>() == 1);
41    assert!(mem::size_of::<Result<Capacity<'static>, Error>>() == mem::size_of::<Error>());
42};