Skip to main content

calimero_sys/types/
buffer.rs

1use core::marker::PhantomData;
2use core::ops::{Deref, DerefMut};
3use core::str::{from_utf8, Utf8Error};
4
5use super::Pointer;
6
7#[cfg(target_arch = "wasm32")]
8mod guest;
9
10#[cfg(not(target_arch = "wasm32"))]
11mod host;
12
13#[repr(C)]
14#[derive(Clone, Copy, Debug, Eq, PartialEq)]
15pub struct Slice<'a, T> {
16    ptr: Pointer<T>,
17    len: u64,
18    _phantom: PhantomData<&'a T>,
19}
20
21pub type Buffer<'a> = Slice<'a, u8>;
22pub type BufferMut<'a> = Buffer<'a>;
23
24impl<'a, T> AsRef<[T]> for Slice<'a, T> {
25    #[inline]
26    fn as_ref(&self) -> &'a [T] {
27        self.as_slice()
28    }
29}
30
31impl<'a, T> AsMut<[T]> for Slice<'a, T> {
32    #[inline]
33    fn as_mut(&mut self) -> &'a mut [T] {
34        self.as_mut_slice()
35    }
36}
37
38impl<'a, T> From<&'a [T]> for Slice<'a, T> {
39    #[inline]
40    fn from(buf: &'a [T]) -> Self {
41        Self::new(buf)
42    }
43}
44
45impl<'a, T> From<&'a mut [T]> for Slice<'a, T> {
46    #[inline]
47    fn from(buf: &'a mut [T]) -> Self {
48        Self::new(buf)
49    }
50}
51
52impl<'a, T> Deref for Slice<'a, T> {
53    type Target = [T];
54
55    #[inline]
56    fn deref(&self) -> &'a Self::Target {
57        self.as_slice()
58    }
59}
60
61impl<'a, T> DerefMut for Slice<'a, T> {
62    #[inline]
63    fn deref_mut(&mut self) -> &'a mut Self::Target {
64        self.as_mut_slice()
65    }
66}
67
68impl<'a> TryFrom<Buffer<'a>> for &'a str {
69    type Error = Utf8Error;
70
71    fn try_from(buf: Buffer<'a>) -> Result<Self, Self::Error> {
72        from_utf8(buf.as_slice())
73    }
74}