Skip to main content

dope_core/io/transfer/
view.rs

1use o3::buffer::bytes;
2
3use crate::io::transfer;
4
5/// Borrowed byte prefix whose length fits every backend completion ABI.
6#[derive(Clone, Copy)]
7#[repr(transparent)]
8pub struct View<'a>(bytes::Prefix<'a, { transfer::MAX_BYTES }>);
9
10impl<'a> View<'a> {
11    pub(crate) const fn from_prefix(bytes: bytes::Prefix<'a, { transfer::MAX_BYTES }>) -> Self {
12        Self(bytes)
13    }
14
15    #[must_use]
16    pub fn prefix(bytes: &'a [u8]) -> Self {
17        Self(bytes::Prefix::new(bytes))
18    }
19
20    #[must_use]
21    pub fn into_parts(self) -> (&'a [u8], transfer::Len) {
22        let bytes = self.0.as_slice();
23        (bytes, self.len())
24    }
25
26    pub(crate) const fn into_prefix(self) -> bytes::Prefix<'a, { transfer::MAX_BYTES }> {
27        self.0
28    }
29
30    #[must_use]
31    pub const fn len(&self) -> transfer::Len {
32        transfer::Len::from_bound(self.0.len())
33    }
34
35    #[must_use]
36    pub const fn as_slice(&self) -> &'a [u8] {
37        self.0.as_slice()
38    }
39}
40
41const _: () = assert!(std::mem::size_of::<View<'static>>() == std::mem::size_of::<&'static [u8]>());