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    #[must_use]
12    pub fn prefix(bytes: &'a [u8]) -> Self {
13        Self(bytes::Prefix::new(bytes))
14    }
15
16    #[must_use]
17    pub fn into_parts(self) -> (&'a [u8], transfer::Len) {
18        let bytes = self.0.into_slice();
19        (bytes, self.len())
20    }
21
22    pub(crate) const fn into_prefix(self) -> bytes::Prefix<'a, { transfer::MAX_BYTES }> {
23        self.0
24    }
25
26    #[must_use]
27    pub const fn len(&self) -> transfer::Len {
28        transfer::Len::from_bound(self.0.len())
29    }
30
31    #[must_use]
32    pub const fn as_slice(&self) -> &'a [u8] {
33        self.0.as_slice()
34    }
35}
36
37const _: () = assert!(std::mem::size_of::<View<'static>>() == std::mem::size_of::<&'static [u8]>());